2017-10-17 238 views
0

我需要的,如下图所示,以我的数据通过一个特定的顺序进行排序。JS排序特定的排序顺序

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

我知道如何asscending排序/降序

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来处理呢?

+2

*“我知道如何asscending排序/降” * - 你确定吗?排序回调不应该返回一个布尔值......总之,都是'data'物品,保证是'sortBy'阵列? – nnnnnn

回答

4

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

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

+0

我在想这是一个非常人为的例子。您的解决方案类型的作品:你在传递值不就行了,像[ 'T', 'A', 'd', 'P', 'E']。您的代码将返回[“t”,“a”,“e”,“d”]。如果你传入[“t”,“a”,“d”,“p”,“e”],你会得到同样的结果! –

+0

没有排序顺序为A,E,D所以最初的测试成功, –

+0

@RobertMoskal - 如果要进行排序数组包含不属于'sortBy'数组中的值,那么我认为应该通过定义排序的结果是未定义,但结果仍然会有相同数量的数组中的项目。但正如我在第一句话中所说的那样,您需要对排序回调进行编码,以便为您的排序规则执行所需的任何操作。该任择议定书并没有说什么,为不'sortBy'值做的,但你可以添加一个if/else或任何默认回字母排序为未知值。 – nnnnnn