繁体   English   中英

基于另一个键数组对对象数组进行排序

[英]Sort object array based on another array of keys

我有两个包含对象的数组。 一个包含某些顺序的键,另一个包含数据,我需要按照给定的排序键数组对数据数组进行排序。 我怎样才能做到这一点?

var a = ['d','a','b','c'] ;
var b =  [{a:1},{c:3},{d:4},{b:2}];

结果应该是:

result = [{d:4},{a:1},{b:2},{c:3]

尝试这个

 var a = ['d','a','b','c'] ; var b = [{a:1},{c:3},{d:4},{b:2}]; b.sort(function(x,y){ var xkey = a.indexOf(Object.keys(x)[0]); var ykey = a.indexOf(Object.keys(y)[0]); return xkey - ykey; }) document.body.innerHTML += JSON.stringify(b,0,4); 

使用Lodash Javascript Library,与上面的方法不同。

 var a = ['d','a','b','c'] ; var b = [{a:1},{c:3},{d:4},{b:2}]; var results = _.map(a,function(av) { var obj = {}; obj[av] = _.find(b, av)[av]; return obj }); document.body.innerHTML += JSON.stringify(results); 
 <script src="https://cdn.jsdelivr.net/lodash/4.11.1/lodash.min.js"></script> 

蛮力方法是循环遍历每个数组并检查b数组是否存在。

 var a = ['d','a','b','c'] ; var b = [{a:1},{c:3},{d:4},{b:2}]; var ans = []; for(var i = 0; i < a.length; ++i) { for(var j = 0; j < b.length; ++j) { if(b[j][a[i]]) ans.push(b[j]); } } document.write(JSON.stringify(ans, 0, 4)); 

这应该可以解决问题

result = a.map(function(key) {
    for(var i=0; i<b.length; ++i) {
        if(key in b[i]) return b[i];
    }
});

此方法尊重数组对象中的键以进行排序。

只有项目a用于查找和他们各自的顺序。

在这种情况下, d获取b项的所有排序值,所以d看起来像

 [ 1, 3, 0, 2 ] 

在使用索引进行排序时,我们需要e ,它只有b的索引

 [ 0, 1, 2, 3 ] 

排序后,它成了

 [ 2, 0, 3, 1 ] 

想要的排序顺序。 现在,原始数组将重新映射到新订单。

但为什么?

通常,对象包含多个属性。 如果你使用Object.keys并只使用第一个元素,那么你可能会出错,因为这个元素不是获取排序顺序所需的元素。

要进行保存,您需要一种不同的方法,它不会将Array#indexOfObject.keys的固定项结合使用。

 var a = ['d', 'a', 'b', 'c'], b = [{ a: 1 }, { c: 3 }, { d: 4 }, { b: 2 }], d = b.map(function (bb) { var k = -1; a.some(function (aa, i) { if (aa in bb) { k = i; return true; } }); return k; }), e = b.map(function (_, i) { return i; }); e.sort(function (a, b) { return d[a] - d[b]; }); b = e.map(function (a) { return b[a]; }); document.write('<pre> ' + JSON.stringify(b, 0, 4) + '</pre>'); 

暂无
暂无

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

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