簡體   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