javascript排序数组与订单数组对齐

时间:2012-10-30 23:12:01

标签: javascript arrays sorting

以下是一个例子:

            //    0     1       2      3       4
 var people = ['jack','jill','nancy','tom','cartman'];
 var order  = [3,1,4,0,2];

 // somehow sort people array to the order specified in the order array

          //  3      1       4        0      2
 people == ['tom','jill','cartman','jack','nancy'];

之前我曾使用.sort和一个函数,但我仍然在这一点上不知所措。

更新

看到一些答案后,我无法相信这对我来说并不明显。因此,有很多方法可以做到这一点,获胜者将由jsperf确定。

(我也赞成每个人都有一个有效的答案)

比赛! http://jsperf.com/array-sorted-to-order-array3

4 个答案:

答案 0 :(得分:6)

sorted = []
order.forEach(function(i) { sorted.push(people[i]) });

或者,更加花哨但不太可读(IMO):

sorted = order.reduce(function(r, i) { 
    return r.concat([people[i]])
}, []);

答案 1 :(得分:4)

另一种方式:)

people = order.map(function(value) { return people[value]; });

jsFiddle

答案 2 :(得分:2)

order是一系列的指标。因此,只需重复一遍,在spcified中提取所需的值,制作一个新的数组。

var people = ['jack','jill','nancy','tom','cartman'];
var order  = [3,1,4,0,2];

var sorted = [];
for (var i = 0; i < order.length; i++) {
  var desiredIndex = order[i];
  sorted.push(people[desiredIndex]);
}

console.log(sorted);
// ["tom", "jill", "cartman", "jack", "nancy"]

有时排序不是“排序”。有时你只需要通过从其他事物中提取数据来创造新事物。

答案 3 :(得分:1)

我不知道,也许这样的事情?

var people = ['jack','jill','nancy','tom','cartman'];
var order  = [3,1,4,0,2];


var result = [], i, n=order.length;

for (i=0; i<n; i++)
{
  result[ order[i] ] = people[i];
}