【问题标题】:sort value of key from object of array that key is optional type in typescript?从数组对象中排序键的值,该键是打字稿中的可选类型?
【发布时间】:2021-06-09 10:13:22
【问题描述】:

对我来说,按键的值对数组对象进行排序的最佳实践是什么?键是对象的可选类型?如果 num 不是可选类型,我有以下代码可以工作但是,我收到Object is possibly 'undefined'.

的错误
type Filter = {
    a: number;
    num?: number

}
const filter: Filter[] = [{a: 1, num: 10}, {a: 1, num: 12}, {a: 1, num: 5}]
filter.sort((a,b)=> (a.num > b.num ? 1 : -1))
console.log(filter)

【问题讨论】:

  • 请考虑修改此问题中的代码以构成minimal reproducible example,将其放入像The TypeScript Playground (link to code) 这样的独立IDE 中时,可以清楚地说明您面临的问题。这将使那些想要帮助您的人立即着手解决问题,而无需首先重新创建它。它将使您得到的任何答案都可以针对定义明确的用例进行测试。
  • [ {a:1}, {a:2}, {a:3, num: 10}] 的预期行为是什么
  • 你的意思是const filter: Filter[]而不是const filter: Filter吗?
  • ` {a:1}, {a:2}, {a:3, num: 10}]` 我希望是 ` {a:1}, {a:2}, { a:3,数量:10}]`
  • 考虑在问题中多解释一点,例如“未定义 num 的元素应放在具有已定义值的元素之前。”

标签: javascript typescript


【解决方案1】:

我想到了两个选项:

  1. 显而易见的:使用num 不是可选的类型。如果您不想在不重写属性的情况下保留这两种类型,则可以使用 Required 实用程序类型。

  2. 如果您无法更改类型,这可能意味着您确实希望该属性是可选的。因此,您只需在排序功能中检查它。您需要检查 num 是否为 undefined 并决定在发生这种情况时返回什么。当您检查它时,Typescript 将推断出所有不属于该条件的内容都将被定义。 例如:


filter.sort((a,b)=> {
  if (typeof a.num === 'undefined' || typeof b.num === 'undefined') {
    return 0;
  }
  return (a.num > b.num ? 1 : -1)
})

【讨论】:

  • 是的,这个问题的关键是决定当numundefined 时要做什么。不过,我真的不推荐这里的特定选择,因为它不是一个一致的比较函数。除此之外,比较函数应该是传递的,但是你的函数将{a: 1}比较等于{a: 2, num: 2}{a: 3, num: 3},它们之间的比较不会相等。这将产生“实现定义的”排序结果,这不太可能是任何人想要的。也许是(a.num ?? -Infinity) - (b.num ?? Infinity) ? ?‍♂️
  • @jcalz 是的。我的目的不是为 OP 问题创建一个理想的排序算法。如果不知道未定义的 num 如何准确地影响订单,就没有正确的解决方案。可能filter.a与订单相关,所以应该改用它。
猜你喜欢
  • 2021-09-22
  • 2020-12-05
  • 1970-01-01
  • 1970-01-01
  • 2021-05-06
  • 2021-10-06
  • 2019-01-02
  • 2022-01-12
  • 2021-04-02
相关资源
最近更新 更多