根据每个对象的id重新排序数组

时间:2017-08-27 12:34:13

标签: javascript arrays sorting

我想知道如何重新排序一个数组,以便每个对象都在它自己的id - 1的索引处。

//Lets say we have an array like so
var unOrderedArray=[{Id:2,Name:"Bob"}, {Id:1,Name:"Julian"},
{Id:3,Name:"Jeff"}]

我能写出什么样的功能才能得到:

var orderedArray=[{Id:1,Name:"Julian"},{Id:2,Name:"Bob"},{Id:3,Name:"Jeff"}]

到目前为止,我已尝试过此功能,但它不起作用:

for(let i = 0;i<unOrderedArray.length;i++){
    correctlyOrderedArray[unOrderedArray[i].Id]=unOrderedArray[i];
}

P.S!不能保证最低Id为1,并且最低和最高Id之间没有间隙,例如2,10,5,3等。

4 个答案:

答案 0 :(得分:6)

使用sort method。无论你有Id个。{/ p>

var unOrderedArray=[{Id:21,Name:"Bob"}, {Id:5,Name:"Julian"},
    {Id:313,Name:"Jeff"}, {Id:4,Name:"Ivan"}];

orderedArray = unOrderedArray.sort(function(a, b) {
   return a.Id - b.Id;
});
console.log(orderedArray);

答案 1 :(得分:1)

您可以使用Array#reduce创建一个包含根据其ID放置的项目的数组。但是,如果id不连续,您将获得一个稀疏数组(一个带孔的数组 - undefineds)。

&#13;
&#13;
var unOrderedArray=[{Id:2,Name:"Bob"}, {Id:1,Name:"Julian"}, {Id:3,Name:"Jeff"}, {Id:10,Name:"Tom"}];

var orderedArray = unOrderedArray.reduce(function(arr, item) {
  arr[item.Id - 1] = item;

  return arr;
}, []);

console.log(orderedArray); // since the Tom's id is 10, you'll get 6 undefined items between Tom and Jeff
&#13;
&#13;
&#13;

答案 2 :(得分:0)

实际上,由于数组基于零,人们可以这样做:

 const result = [];
 for(var obj of unOrderedArray){
  result[obj.Id] = obj;
 }

结果是

[undefined, { Id:1,Name:"Bob"},...]

所以可以做到

result[1]

获取id为1的对象。

答案 3 :(得分:0)

如果你不确定这些ID是否完全顺序1-N,你可以使用它:

const sortById = arr => {
  if (!arr.length) return arr;
  const max = Math.max(...arr.map(obj => obj.Id));
  let result = Array(max).fill(null);
  arr.forEach(obj => result[obj.Id] = obj);
  return result;
};