TIM*_*MEX 13 javascript arrays sorting algorithm json
我有一个对象列表:
[ { id: 4, name:'alex' }, { id: 3, name:'jess' }, { id: 9, name:'...' }, { id: 1, name:'abc' } ]
Run Code Online (Sandbox Code Playgroud)
我有另一个正确的"订单"列表.
[ 3, 1, 9, 4]
Run Code Online (Sandbox Code Playgroud)
如何根据键"id"将第一个列表与第二个列表的顺序相匹配?结果应该是:
[ { id: 3, name:'jess' }, { id: 1, name:'abc' }, { id: 9, name:'...' }, { id: 4, name:'alex' } ]
Run Code Online (Sandbox Code Playgroud)
HCl*_*Clx 27
我介入了这个问题并用一个简单的方法解决了它 .sort
假设要排序的列表存储在变量中,needSort
并且带有顺序的列表位于变量中order
且两者都在同一范围内,您可以运行.sort
如下:
needSort.sort(function(a,b){
return order.indexOf(a.id) - order.indexOf(b.id);
});
Run Code Online (Sandbox Code Playgroud)
它对我有用,希望它有所帮助.
小智 7
嗯,简单的答案是,"对于一组数据这么小,任何比无限循环都要便宜的东西基本上都是不可察觉的." 但让我们试着回答这个"正确".
第二个数组中的顺序没有押韵或理由,它只是第一个数组主键上的外键列表(使用SQL术语).因此,将它们视为键,并且我们希望有效地查找这些键,哈希表(对象)可能会以最快的O(n)
方式"排序"它,以某种方式(2*n
实际上)假设第一个数组被调用objArray
而第二个数组被称为keyArray
:
// Create a temporary hash table to store the objects
var tempObj = {};
// Key each object by their respective id values
for(var i = 0; i < objArray.length; i++) {
tempObj[objArray[i].id] = objArray[i];
}
// Rebuild the objArray based on the order listed in the keyArray
for(var i = 0; i < keyArray.length; i++) {
objArray[i] = tempObj[keyArray[i]];
}
// Remove the temporary object (can't ``delete``)
tempObj = undefined;
Run Code Online (Sandbox Code Playgroud)
这应该做到这一点.我想不出任何不需要两遍的方法.(像这样一个接一个地,或者通过多次遍历数组并splice
输出找到的元素,例如,对于向后排序的数据可能会花费很多.)
我是如何解决同样的问题的
data = [{ id: 4, name:'alex' }, { id: 3, name:'jess' }, { id: 9, name:'...' }, { id: 1, name:'abc' } ];
sorted = [3, 1, 9, 4].map((i) => data.find((o) => o.id === i));
Run Code Online (Sandbox Code Playgroud)