javascript - JS 按特定排序顺序排序

标签 javascript arrays sorting ecmascript-6

我需要按特定顺序对数据进行排序,如下所示。

const sortBy = ['b','a','c','e','d']
const data = ['a','d','e']

我知道如何按升序/降序排序

console.log(data.sort((a, b) => a > b)) //["a", "d", "e"]
console.log(data.sort((a, b) => a < b)) //["e", "d", "a"]

但是是否可以使用 .sort 按特定顺序排序? 例如,下面我想要的顺序是 sortBy

我目前正在通过在排序数组和数据之间创建一个公共(public)项数组来实现此目的。

const commonItems = getCommonItemsInArrays(sortBy,data)
console.log(commonItems.map(item => item)) //["a", "e", "d"]

function getCommonItemsInArrays(array1,array2){
  return array1.filter(n => array2.indexOf(n) >= 0)
}

这似乎工作正常,但我想知道是否有办法通过 sort 来处理这个问题?

最佳答案

您的 .sort() 回调可以执行所需的任何操作,以确定任何给定项目是否应该位于任何其他给定项目之前或之后。因此它可以在 sortBy 数组中查找当前项目的索引并进行相应操作:

const sortBy = ['b','a','c','e','d']
const data = ['a','d','e']

console.log( data.sort((a,b) => sortBy.indexOf(a) - sortBy.indexOf(b)) )

在排序过程中多次调用 .indexOf() 效率会很低,因此您可能需要在开始之前将 sortBy 转换为对象:

const sortBy = ['b','a','c','e','d']
const data = ['a','d','e']

const sortByObject = sortBy.reduce((a,c,i) => {
  a[c] = i
  return a
}, {})

console.log( data.sort((a,b) => sortByObject[a] - sortByObject[b]) )

(请注意,排序回调不应返回 bool 值。)

关于javascript - JS 按特定排序顺序排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46781765/

相关文章:

javascript - 圆心的字符串 - Fabrics.js

javascript - TypeError : Cannot read property 'map' of undefined. 找不到解决办法

javascript - 数组中的子数组

python - Pandas 数据透视表手动对列进行排序

javascript - 使用 jquery 滚动到页面上的特定元素

javascript - Jquery 位置没有给出预期的结果

javascript - 在 Aurelia 中刷新详细信息页面会导致空白

arrays - 数组上的 Bash 子字符串扩展

arrays - 数组的 "number of partitions"和 "range"是什么?

Javascript 两个 arraySort 返回相同的结果