【问题标题】:Sort an array using another array in strictly same order typescript使用严格相同的顺序打字稿使用另一个数组对数组进行排序
【发布时间】:2021-08-30 16:25:58
【问题描述】:

我正在尝试对这个数组进行排序

const originalArray = ['Apple', 'Cat', 'Fan', 'Zebra', 'Goat', 'Van'];

使用这个数组

const sortOrder = ['Zebra', 'Van', "Cat"];

我试过用这个方法;

const sortedArray = originalArray.sort((a, b) => {
  return sortOrder.indexOf(b) - sortOrder.indexOf(a);
});

console.log(sortedArray) // Output:["Cat","Van","Zebra","Apple","Fan","Goat"]

虽然这不是预期的结果

预期的输出应该是这样的

["Zebra","Van","Cat","Apple","Fan","Goat"]

使用任何库以及 lodash 对任何解决方案开放。 提前致谢

【问题讨论】:

  • 反转排序顺序反转您比较项目的方式:sortOrder.indexOf(b) - sortOrder.indexOf(a) -> sortOrder.indexOf(a) - sortOrder.indexOf(b)
  • 这是在数组的末尾添加排序值,但我希望它在数组的开头。
  • 我看不出这是一个打字稿问题?
  • 如果我使用像 lodash 这样的库,打字稿会抛出错误

标签: javascript arrays typescript sorting lodash


【解决方案1】:

你可以取一个带有顺序的对象,对于未知的项目取一个很大的值来将它们排序到数组的末尾

const
    array = ['Apple', 'Cat', 'Fan', 'Zebra', 'Goat', 'Van'],
    sortOrder = ['Zebra', 'Van', "Cat"],
    order = Object.fromEntries(sortOrder.map((k, i) => [k, i + 1]));

array.sort((a, b) =>
    (order[a] || Number.MAX_VALUE) - (order[b] || Number.MAX_VALUE)
);

console.log(array);

【讨论】:

  • 我收到一个错误Property 'default' does not exist on type '[string, unknown][]
  • 您可以直接使用Number.MAX_VALUE。请参阅编辑。
  • 是的,它起作用了,非常感谢,实际上我的用例在列表中非常。你是救生员。
  • 能否请您稍微解释一下排序中发生的情况以及我们为何使用 MAX_VALUE
  • 基本上 i 按索引(加一,因为我们稍后需要假零)和 delta(这是标准的)和使用另一个值(如果为零)对已知值后面的未知值进行排序。 Number.MAX_VALUE 大于任何其他索引值(32 位正数)。
【解决方案2】:

尝试使用sortOrder的反向排序

const originalArray = ['Apple', 'Cat', 'Fan', 'Zebra', 'Goat', 'Van'];
const sortOrder = ['Zebra', 'Van', "Cat"];

// reverse the `sortOrder`
let reverseOrder = sortOrder.reverse();

// if you want to keep `sortOrder` as it is
// then do slice() and then reverse()
// let reverseOrder = sortOrder.slice().reverse();

// The key point here is to sort by reverse of `sortOrder`
let sortedArray = originalArray.sort((a, b) => {
  return reverseOrder.indexOf(b) - reverseOrder.indexOf(a);
})

console.log(sortedArray)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 2017-12-24
    • 2017-03-19
    • 1970-01-01
    • 2018-06-03
    相关资源
    最近更新 更多