JS按特定排序顺序

时间:2017-10-17 02:51:24

标签: 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

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

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来处理这个问题?

1 个答案:

答案 0 :(得分:5)

您的.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]) )

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