admin管理员组文章数量:1313149
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
?
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?
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
?
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?
Share Improve this question asked Jun 25, 2011 at 8:09 TIMEXTIMEX 272k367 gold badges801 silver badges1.1k bronze badges4 Answers
Reset to default 4Here 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. The resulting reordered array is stored in result.
Arrays can be sorted using your own custom sort algorithm, so you don't really need 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:
friends.sort(function(a, b) {
if (real_order.indexOf(a.id) > real_order.indexOf(b.id)) {
return 1;
}else{
return -1;
}
});
One mand solution. Ugly like jQuery, but people like John Resig love this style for some reason :)
friends.sort(
(function(order){
return function(a, b) {
return order.indexOf(a.id)-order.indexOf(b.id);
}
})(real_order)
);
本文标签: How do I reorder this array in Javascript based on another arrayStack Overflow
版权声明:本文标题:How do I reorder this array in Javascript based on another array? - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1741935299a2405820.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论