我可以想象这个问题已经被问过几次了,但我真的找不到解决我想要解决的特定问题的例子。
所以我有一个对象,像这样:
var collection = [{ id: 0 }, { id: 1 }, { id: 2 }];
然后我有一个数组,即“订单”,如下所示:
var order = [2, 0, 1];
我想使用 'order' 数组以特定顺序重新排序集合。我一直在尝试使用 .sort 函数的多种解决方案,但找不到适合的解决方案。任何人都可以启发我吗?可能很简单,我希望。
我可以想象这个问题已经被问过几次了,但我真的找不到解决我想要解决的特定问题的例子。
所以我有一个对象,像这样:
var collection = [{ id: 0 }, { id: 1 }, { id: 2 }];
然后我有一个数组,即“订单”,如下所示:
var order = [2, 0, 1];
我想使用 'order' 数组以特定顺序重新排序集合。我一直在尝试使用 .sort 函数的多种解决方案,但找不到适合的解决方案。任何人都可以启发我吗?可能很简单,我希望。
您可以使用该sort()
方法来完成此操作indexOf
:
collection.sort(function(a, b){
return order.indexOf(a.id) > order.indexOf(b.id);
});
您可以indexOf
在自定义排序函数中对订单数组使用函数,如下所示:
collection.sort(function(x, y) {
return order.indexOf(x.id) > order.indexOf(y.id);
});
似乎就这么简单:
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]]);
}
试试看:
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);
您在这里要避免的事情是扫描这些阵列中的任何一个,而不是您必须这样做。
这是避免这种情况的一种解决方案:
/*
* 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 之类的库,或者重写它以对数组使用显式迭代。