开发者

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? The result should be:

[ 
            { name: 'alex', id: '1'},
            开发者_Python百科{ 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. 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 command 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)
);
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜