如何根据另一个数组在Javascript中重新排序此数组?

时间:2021-11-18 08:09:19
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:

如何让“friends”数组“匹配”real_order中的元素?结果应该是:

[ 
            { name: 'alex', id: '1'},
            { name: 'bob', id: '2' },
            { name: 'kat', id: '3' },
            { name: 'jess', id: '4'},
          ] 

What is the most efficient solution?

什么是最有效的解决方案?

4 个解决方案

#1


5  

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.

这样做是因为它创建了一个键入每个朋友ID的字典,然后使用第二个数组进行查找并构造新数组。生成的重新排序数组存储在result中。

#2


4  

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

可以使用您自己的自定义排序算法对数组进行排序,因此您不需要real_order。这是我的方式(编辑:添加排序委托以排序降序):

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

#3


0  

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;
    }
});

#4


0  

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

#1


5  

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.

这样做是因为它创建了一个键入每个朋友ID的字典,然后使用第二个数组进行查找并构造新数组。生成的重新排序数组存储在result中。

#2


4  

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

可以使用您自己的自定义排序算法对数组进行排序,因此您不需要real_order。这是我的方式(编辑:添加排序委托以排序降序):

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

#3


0  

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;
    }
});

#4


0  

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