我有一个从这样的数据库返回的对象:[{id:1},{id:2},{id:3}]
。我有另一个数组,指定第一个数组应该排序的顺序,如下所示:[2,3,1]
。
我正在寻找可以接收这两个数组并返回[{id:2},{id:3},{id:1}]
的方法或算法。理想情况下,它应该是有效的而不是n平方。
答案 0 :(得分:7)
如果你想要线性时间,首先从第一个数组构建一个哈希表,然后通过循环第二个数组来顺序选择项目:
data = [{id:5},{id:2},{id:9}]
order = [9,5,2]
hash = {}
data.forEach(function(x) { hash[x.id] = x })
sorted = order.map(function(x) { return hash[x] })
document.write(JSON.stringify(sorted))

答案 1 :(得分:3)
function sortArrayByOrderArray(arr, orderArray) {
return arr.sort(function(e1, e2) {
return orderArray.indexOf(e1.id) - orderArray.indexOf(e2.id);
});
}
console.log(sortArrayByOrderArray([{id:1},{id:2},{id:3}], [2,3,1]));

答案 2 :(得分:1)
在您的示例中,对象最初按id
排序,这使得任务非常简单。但是,如果这种情况一般不正确,您仍然可以根据id
值的数组以线性时间对对象进行排序。
我们的想法是先创建一个索引,将每个id
值映射到其位置,然后通过在索引中查找其id
值将每个对象插入所需位置。这需要迭代两个长度为n
的数组,从而导致整个运行时间为O(n)
或线性时间。没有渐近更快的运行时因为读取输入数组需要线性时间。
function objectsSortedBy(objects, keyName, sortedKeys) {
var n = objects.length,
index = new Array(n);
for (var i = 0; i < n; ++i) { // Get the position of each sorted key.
index[sortedKeys[i]] = i;
}
var sorted = new Array(n);
for (var i = 0; i < n; ++i) { // Look up each object key in the index.
sorted[index[objects[i][keyName]]] = objects[i];
}
return sorted;
}
var objects = [{id: 'Tweety', animal: 'bird'},
{id: 'Mickey', animal: 'mouse'},
{id: 'Sylvester', animal: 'cat'}],
sortedIds = ['Tweety', 'Mickey', 'Sylvester'];
var sortedObjects = objectsSortedBy(objects, 'id', sortedIds);
// Check the result.
for (var i = 0; i < sortedObjects.length; ++i) {
document.write('id: '+sortedObjects[i].id+', animal: '+sortedObjects[i].animal+'<br />');
}
答案 3 :(得分:0)
根据我的理解,不需要分类;至少在您的示例中,可以按线性时间生成所需的结果数组。
var Result;
for ( var i = 0; i < Input.length; i++ )
{
Result[i] = Input[Order[i]-1];
}
此处Result
是所需的输出,Input
是您的第一个数组,Order
数组包含所需的位置。
答案 4 :(得分:0)
var objArray = [{id:1},{id:2},{id:3}];
var sortOrder = [2,3,1];
var newObjArray = [];
for (i in sortOrder) {
newObjArray.push(objArray[(sortOrder[i]) - 1])
};
答案 5 :(得分:0)
为什么不创建新数组并从第二个数组中推送值?如果我错了,请纠正我
array1 = [];
array2 = [2,3,1];
for ( var i = 0; i < array2 .length; i++ )
{
array1.push({
id : array2[i]
})
}