我可以想象这已被问过几次,但我确实无法找到解决我想弄清楚的具体问题的例子。
所以我有一个对象,就像这样:
var collection = [{ id: 0 }, { id: 1 }, { id: 2 }];
然后我有一个数组,就是'顺序',就像这样:
var order = [2, 0, 1];
我想使用'order'数组按特定顺序重新排序集合。我一直在用.sort函数尝试很多解决方案,但我找不到合适的解决方案。任何人都可以开导我吗?可能很简单,我希望。
答案 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这样的库,或者重写它以对数组使用显式迭代。