【问题标题】:how to sort object array in TypeScript如何在 TypeScript 中对对象数组进行排序
【发布时间】:2020-09-28 02:57:40
【问题描述】:

我是 TypeScript 的新手。我可能会问一个菜鸟问题。我有以下对象数组。我想按年龄或姓名对其进行排序。这个问题之前有人问过。我在阅读this answer.And this 后尝试关注。我无法在 TypeScript 中编译它。

    sortData2() {
  const testData: object[] =  [
    {
      name: 'name 1',
      age: 20,
      sex: 'M',
      height: 7.5
    },
    {
      name: 'name 1',
      age: 10,
      sex: 'M',
      height: 6.5
    },
    {
      name: 'name 3',
      age: 30,
      sex: 'F',
      height: 4.5
    }
  ];

  testData.sort( (a, b) => {
      return compare(a, b);
  });

  
  function compare(a: number | string | object, b: number | string | object) {
    // compiler error Property 'age' does not exist on type 'string | number | object'.
    return (a.age < b.age ? -1 : 1);
  }
  console.log(testData);
}

如何排序?提前致谢!

【问题讨论】:

  • 是否有理由将 compare 声明为函数而不是 inline 定义它?您还应该删除 object[] 类型:打字稿会推断出更好的东西
  • ab 不会是 number | string | object 只有 object。即便如此,你最好为你的对象定义一个接口,这样你就可以更准确地进行类型检查。
  • 实际上,我从另一个函数调用中得到了一个对象数组。我无法更改第 3 方 API 调用。所以我无法定义自己的任何接口。
  • 你不能写interface Person {name: string, age: number, sex: 'F' | 'M, height: number }
  • 我试图通过这个简单的人像界面来模拟我的真实代码和问题。我的真实代码远比这个简单的界面复杂。

标签: arrays typescript object


【解决方案1】:

在您的比较函数中,您是说 a 和 b 可以是对象、字符串或数字;但是随后您正在检查 a.age,除非 a 和 b 是具有属性 age 的对象,否则这是没有意义的。那你为什么要在这里接受这么多可能的类型呢?

替换这个:

function compare(a: number | string | object, b: number | string | object) {
    return (a.age < b.age ? -1 : 1);
}

有了这个:

function compareAge(a: {age: number}, b: {age: number}): number {
    return (a.age < b.age ? -1 : 1);
}

或者更好的是,它可以更好地处理 a.age 和 b.age 相等的情况。如果 a 小于 b,array.sort compare function 应该返回一个小于 0 的数字,如果 a 大于 b,则返回大于 0,或者如果它们相等则返回 0。数字的实际值无关紧要 - 只是符号。所以你可以映射到-1或1,但这是不必要的。一个简单的减法可以返回正数、负数和 0。

function compareAge(a: {age: number}, b: {age: number}): number {
    return a.age - b.age;
}

调用testData.sort( compareAge ); 时仍然会报错,因为你用testData: object[] 声明了一个非常模糊的类型。您可以完全删除此类型,Typescript 将推断出正确的类型,或者您可以将其声明为更具体的类型,例如 testData: Person[]。只要 testData(或任何其他数组)的元素扩展 {age: number},您就可以使用 compareAge 进行排序。

【讨论】:

    猜你喜欢
    • 2022-09-27
    • 2014-03-08
    • 1970-01-01
    • 2021-04-15
    • 2019-11-02
    • 2010-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多