繁体   English   中英

如何在 TypeScript 中对对象数组进行排序

[英]how to sort object array in TypeScript

我是 TypeScript 的新手。 我可能会问一个菜鸟问题。 我有以下对象数组。 我想按年龄或姓名对其进行排序。 这个问题之前有人问过。 阅读此答案后,我尝试遵循 而这个 我无法在 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);
}

我该如何排序? 提前致谢!

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

替换这个:

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 比较函数应该返回一个小于 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.sort( compareAge ); 因为你已经用testData: object[]声明了一个非常模糊的类型。 您可以完全删除此类型,Typescript 会推断出正确的类型,或者您可以将其声明为更具体的类型,例如testData: Person[] 只要 testData(或任何其他数组)的元素扩展{age: number}您就可以使用compareAge进行排序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM