简体   繁体   中英

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'},
            { 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)
);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM