0

我可以想象这个问题已经被问过几次了,但我真的找不到解决我想要解决的特定问题的例子。

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

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

然后我有一个数组,即“订单”,如下所示:

var order = [2, 0, 1];

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

4

5 回答 5

5

您可以使用该sort()方法来完成此操作indexOf

collection.sort(function(a, b){
    return order.indexOf(a.id) > order.indexOf(b.id);
});
于 2013-02-10T23:40:57.513 回答
2

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

collection.sort(function(x, y) {
                     return order.indexOf(x.id) > order.indexOf(y.id);
                });
于 2013-02-10T23:43:52.467 回答
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]]);
}
于 2013-02-10T23:37:59.900 回答
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);
于 2013-02-10T23:40:07.767 回答
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 之类的库,或者重写它以对数组使用显式迭代。

于 2013-02-10T23:45:05.843 回答