通过另一个数组中包含的对象属性对Javascript数组进行排序

时间:2015-09-03 11:15:32

标签: javascript arrays sorting

我的第一个数组看起来像这样:

[
    {entityId: 1, name: 'Total sales'},
    {entityId: 2, name: 'Total customers'},
    {entityId: 3, name: 'Reach'}
]

我有第二个存储entityId的数组,我需要使用第二个数组的值对第一个数组进行排序。所以,如果我的第二个数组看起来像这样:

[1, 3, 2]

然后我的第一个数组应该像这样排序:

[
    {entityId: 1, name: 'Total sales'},
    {entityId: 3, name: 'Reach'},
    {entityId: 2, name: 'Total customers'}
]

我知道我可以使用sort方法和我自己的回调基于对象属性对数组进行排序:

array.sort(function(a, b) {
    // ... sorting logic ...
});

然而,我正在努力解决排序逻辑如何遵循第二个数组强加的排序规则,而不仅仅是比较两个相邻元素。

3 个答案:

答案 0 :(得分:8)

使用Array.prototype.indexOf

var arr = [
    {entityId: 1, name: 'Total sales'},
    {entityId: 2, name: 'Total customers'},
    {entityId: 3, name: 'Reach'}
];

var indArr = [3, 1, 2];

arr.sort(function(a, b) {
    return indArr.indexOf(a.entityId) - indArr.indexOf(b.entityId);
});

console.log(arr);

JSFIDDLE

答案 1 :(得分:1)

另一种变体,可能更适合大数组,因为迭代数组只需两次。如果indexOf - 在每个调用排序回调上迭代两次。

首先,从第一个数组创建地图

var array = [
    {entityId: 1, name: 'Total sales'},
    {entityId: 2, name: 'Total customers'},
    {entityId: 3, name: 'Reach'}
];

var map = array.reduce(function(acc,el){
    acc[el.entityId] = el;
    return acc;
},{});

第二,只是映射第二个数组

var indexes = [1, 3, 2];

var result = indexes.map(function(index){ return map[index];});

天真test in jsperf

答案 2 :(得分:-1)

最简单的代码是:

var a = [
    {entityId: 1, name: 'Total sales'},
    {entityId: 2, name: 'Total customers'},
    {entityId: 3, name: 'Reach'}
];

var b = [1,3,2];
var c = b.slice(); //create copy

for (var i = 0;i< a.length;i++)
{
   var indexOf = b.indexOf(a[i].entityId);

   c[indexOf] = a[i];
}

console.log(c)

尝试jsfiddle