admin管理员组

文章数量:1313362

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 badges
Add a ment  | 

4 Answers 4

Reset to default 4

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 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