按值排序对象

时间:2013-02-10 23:35:11

标签: javascript sorting

我可以想象这已被问过几次,但我确实无法找到解决我想弄清楚的具体问题的例子。

所以我有一个对象,就像这样:

var collection = [{ id: 0 }, { id: 1 }, { id: 2 }];

然后我有一个数组,就是'顺序',就像这样:

var order = [2, 0, 1];

我想使用'order'数组按特定顺序重新排序集合。我一直在用.sort函数尝试很多解决方案,但我找不到合适的解决方案。任何人都可以开导我吗?可能很简单,我希望。

5 个答案:

答案 0 :(得分:5)

您可以使用sort()方法使用indexOf

完成此操作
collection.sort(function(a, b){
    return order.indexOf(a.id) > order.indexOf(b.id);
});

答案 1 :(得分:2)

您可以在自定义排序功能的订单数组中使用indexOf函数,如下所示:

collection.sort(function(x, y) {
                     return order.indexOf(x.id) > order.indexOf(y.id);
                });

答案 2 :(得分:1)

似乎就像那样容易:

var collection = [{ id: 0 }, { id: 1 }, { id: 2 }];
var order = [2, 0, 1];
var sorted = [];
for(var i=0,c=order.length;i<c;i++){
    sorted.push(collection[order[i]]);
}

答案 3 :(得分:1)

试试:

var collection = [{ id: 0 }, { id: 1 }, { id: 2 }];
var order = [2, 0, 1];
var sortedCollection = [];
for ( var i = 0; i < order.length; i++ ) 
  sortedCollection.push(collection[order[i]]);
console.log(sortedCollection);

答案 4 :(得分:0)

你想要避免的事情是扫描这些阵列中的任何一个,而不是必须。

这是避免这种情况的一种解决方案:

/*
 * Map the indexes of the objects in collection to their final location
 */
var sortIndex = {};
order.forEach(function(value, index) {
  sortIndex[value] = index;
});

/*
 * Put the objects in collection into their new, sorted collection
 */
var sortedCollection = [];
collection.forEach(function(value) {
  var sortedLocation = sortIndex[value.id];
   sortedCollection[sortedLocation] = value;

});

因此,我们对每个阵列进行单次扫描,将工作量降至最低。

我在这里使用forEach是为了方便;你可以使用像Lodash或Underscore这样的库,或者重写它以对数组使用显式迭代。