![](/img/trans.png)
[英]How do I compare and update this array based on another array in JavaScript?
[英]How do I reorder this array in Javascript based on another array?
real_order = [ '1', '2', '3', '4'];
friends = [ { name: 'jess', id: '4'},
{ name: 'alex', id: '1'},
{ name: 'kat', id: '3' },
{ name: 'bob', id: '2' }
]
如何让“friends”数组“匹配” real_order
的元素? 结果应该是:
[
{ name: 'alex', id: '1'},
{ name: 'bob', id: '2' },
{ name: 'kat', id: '3' },
{ name: 'jess', id: '4'},
]
什么是最有效的解决方案?
以下是一些可以执行此操作的代码:
var i, d = {}, result = [];
for(i=0; i<friends.length; ++i)
{
d[friends[i].id] = friends[i];
}
for(i=0; i<real_order.length; ++i)
{
result.push(d[real_order[i]]);
}
这样做是因为它创建了一个键入每个朋友id的字典,然后使用第二个数组进行查找并构造新数组。 生成的重新排序数组存储在result中。
可以使用您自己的自定义排序算法对数组进行排序,因此您不需要real_order
。 这是我的方式( 编辑 :添加排序委托以排序降序):
var friends = [
{ id:4, name: 'jess'},
{ id:1, name: 'alex'},
{ id:3, name: 'kat' },
{ id:2, name: 'bob' }
];
var order = function(a,b,desc){
return desc ? b.id - a.id : a.id - b.id;
},
orderDesc: function(a,b){return order(a,b,true);};
var friendsOrdered = friends.sort( order );
alert(friendsOrdered[0].name); //=> alex
alert(friendsOrdered[3].name); //=> jess
//or sort descending
var friendsOrdered = friends.sort( orderDesc );
alert(friendsOrdered[0].name); //=> jess
alert(friendsOrdered[3].name); //=> alex
确保real_order
在全局范围内,这应该这样做:
friends.sort(function(a, b) {
if (real_order.indexOf(a.id) > real_order.indexOf(b.id)) {
return 1;
}else{
return -1;
}
});
一个命令解决方案 像jQuery一样难看,但像John Resig这样的人出于某种原因喜欢这种风格:)
friends.sort(
(function(order){
return function(a, b) {
return order.indexOf(a.id)-order.indexOf(b.id);
}
})(real_order)
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.