按照特定排序顺序对JS进行排序

4
我需要按照以下特定顺序对我的数据进行排序。
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处理的方法?


3
"我知道如何按升序/降序排序" - 你确定吗?排序回调函数不应返回布尔值...无论如何,这些data项目是否保证在sortBy数组中? - nnnnnn
1个回答

14

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

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


我认为这是一个相当牵强的例子。你的解决方案有点可行:你传入了一个不在列表中的值,比如['t','a','d','p','e']。你的代码返回["t","a","e","d"]。如果你传入["t","a","d","p","e"],你得到的结果是一样的! - Robert Moskal
排序顺序为a,e,d,因此初始测试是正常的。 - Robert Moskal
@RobertMoskal - 如果要排序的数组包含未在“sortBy”数组中的值,那么我认为根据定义,排序的结果是未定义的,但结果仍将具有相同数量的项目。但正如我在第一句话中所说,您可以编写排序回调以执行您的排序规则所需的任何操作。 OP没有说明对于不在“sortBy”中的值应该怎么做,但您可以添加if / else或其他内容,以默认为未知值进行字母排序。 - nnnnnn
没有我的大批评。这是一种有点奇怪的情况。 - Robert Moskal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接