繁体   English   中英

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

[英]Ordering a Javascript array by object properties contained in another array

我的第一个数组如下所示:

[
    {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自己的回调使用sort方法来基于对象属性对数组进行sort

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

但是,我正在努力思考排序逻辑将如何遵循第二个数组施加的排序规则,而不是仅仅比较两个相邻元素。

使用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

还有另一种变体,可能对大型阵列更好,因为仅对阵列进行两次迭代。 万一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];});

jsperf中的天真测试

最简单的代码是:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM