我需要按特定顺序对数据进行排序,如下所示。
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/