我有两个包含对象的数组。一个包含某些顺序的键,另一个包含数据,我需要按照给定的排序键数组对数据数组进行排序。我怎么能这样做?
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]
答案 0 :(得分:7)
试试这个
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);

答案 1 :(得分:4)
使用Lodash
Javascript库,与上面的方法不同。
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>
&#13;
答案 2 :(得分:0)
蛮力方法是遍历每个数组并检查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));
&#13;
答案 3 :(得分:0)
这应该可以解决问题
result = a.map(function(key) {
for(var i=0; i<b.length; ++i) {
if(key in b[i]) return b[i];
}
});
答案 4 :(得分:0)
此方法尊重数组对象中的键以进行排序。
只有a
的项目用于查找及其各自的订单。
在这种情况下,
d
获取b
项的所有排序值,因此d
看起来像[ 1, 3, 0, 2 ]
在使用索引进行排序时,我们需要
的索引e
,其中只有b
排序后[ 0, 1, 2, 3 ]
成为
[ 2, 0, 3, 1 ]
想要的排序顺序。现在,原始数组被重新映射到新订单。
但为什么?
通常,对象包含多个属性。如果你使用Object.keys
并只使用第一个元素,那么你可能会出错,因为这个元素不是获取排序顺序所需的元素。
要进行保存,您需要一种不同的方法,该方法不会将Array#indexOf
与Object.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>');