[英]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' }
]
How do I make "friends" array "match" the elements in real_order
? 如何让“friends”数组“匹配”
real_order
的元素? The result should be: 结果应该是:
[
{ name: 'alex', id: '1'},
{ name: 'bob', id: '2' },
{ name: 'kat', id: '3' },
{ name: 'jess', id: '4'},
]
What is the most efficient solution? 什么是最有效的解决方案?
Here is some code that would do it: 以下是一些可以执行此操作的代码:
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]]);
}
What this does is it creates a dictionary keyed on each of the friends' id, then uses the second array to do a look up and construct the new array. 这样做是因为它创建了一个键入每个朋友id的字典,然后使用第二个数组进行查找并构造新数组。 The resulting reordered array is stored in result.
生成的重新排序数组存储在result中。
Arrays can be sorted using your own custom sort algorithm, so you don't really need real_order
. 可以使用您自己的自定义排序算法对数组进行排序,因此您不需要
real_order
。 This is the way I'd do it ( edit : added sort delegate for sorting descending): 这是我的方式( 编辑 :添加排序委托以排序降序):
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
make sure that real_order
is in global scope and this should do it: 确保
real_order
在全局范围内,这应该这样做:
friends.sort(function(a, b) {
if (real_order.indexOf(a.id) > real_order.indexOf(b.id)) {
return 1;
}else{
return -1;
}
});
One command solution. 一个命令解决方案 Ugly like jQuery, but people like John Resig love this style for some reason :)
像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.