根据另一个数组按顺序排序数组

时间:2014-12-04 09:05:09

标签: javascript algorithm sorting

我有一个从这样的数据库返回的对象:[{id:1},{id:2},{id:3}]。我有另一个数组,指定第一个数组应该排序的顺序,如下所示:[2,3,1]

我正在寻找可以接收这两个数组并返回[{id:2},{id:3},{id:1}]的方法或算法。理想情况下,它应该是有效的而不是n平方。

6 个答案:

答案 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]
     })
}