[英]Transform an array of objects by removing object properties not contained in another array
[英]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 ...
});
但是,我正在努力思考排序逻辑将如何遵循第二个数组施加的排序规则,而不是仅仅比较两个相邻元素。
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];});
最简单的代码是:
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.