我的第一个数组看起来像这样:
[
{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 ...
});
然而,我正在努力解决排序逻辑如何遵循第二个数组强加的排序规则,而不仅仅是比较两个相邻元素。
答案 0 :(得分:8)
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);
答案 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];});
答案 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