【问题标题】:Comparator in Typescript for custom sort on array [duplicate]Typescript中的比较器,用于对数组进行自定义排序[重复]
【发布时间】:2020-02-05 18:40:01
【问题描述】:

所以我想对一个总是以不同顺序排列的数组使用自定义排序:[{code: 'A'},{code: 'O'},{code: 'I'}], [{code: 'O'},{code: 'A'},{code: 'I'}], ...

我想要[{code: 'A'},{code: 'O'},{code: 'I'}] 的顺序。

export function someSort(arrayToSort): Array {
  if (!arrayToSort || arrayToSort.length < 1) {
    return [];
  }
  const sorted = new Map();
  const sorting = ['A', 'O', 'I'];

  for (let i = 0; i < sorting.length; ++i) {
    sorted.set(sorting[i], i);
  }
  return arrayToSort.sort((a, b) => sorted.get(a.code) - sorted.get(b.code));
}

我尝试了这个,我将我想要的排序添加到一个带有键“A”的地图中,作为一个数字,所以它是可排序的,但我收到一个错误core.js:15724 ERROR TypeError: Cannot assign to read only property '0' of object '[object Array]' 现在我没有想法了。

【问题讨论】:

标签: javascript arrays typescript sorting


【解决方案1】:

你已经走得太远了。

仅使用数组进行排序就足够了,依赖于其中项目的索引。

const data = [
  { code: 'O' },
  { code: 'A' },
  { code: 'I' },
];

const order = ['A', 'O', 'I'];

const sorted = data.sort((a, b) => order.indexOf(a.code) - order.indexOf(b.code));

console.log(sorted);

【讨论】:

  • 如果 OP 的代码出现错误,他们也应该得到错误
  • 这更具可读性,写了一些单元测试,你和我的工作都在其他地方。谢谢!
  • @adiga 确实,根本没有关注错误,而是关注代码的可读性!
  • @BurstofIce 好的,如果您可以提供您的问题的minimal reproducible example,我们可以更好地理解它!如果您使用 Angular,请考虑使用 stackblitz.com
  • @BurstofIce 但是,如果你的数组中有很多对象,你的代码会更好,因为这是O(n2)
【解决方案2】:

该数组来自 redux 存储并且它是不可变的,因此我在调用 sort() 之前通过执行 slice() 解决了它。但是@Maryannah's solution 还是比我的好很多。

【讨论】:

    【解决方案3】:

    您的代码不会为我引发运行时错误,但会引发构建错误 re: type declaration。 Array 需要一个类型,即使它是 any。将函数声明更改为

    export function someSort(arrayToSort): Array<any> {
    

    为我修复了它(如:构建、运行并产生预期结果)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 2018-04-25
      • 1970-01-01
      • 2023-04-06
      相关资源
      最近更新 更多