Мне было интересно, как я мог бы переупорядочить массив так, чтобы каждый объект имел собственный индекс 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 и т. Д.

3
Albert Koppelmaa 27 Авг 2017 в 15:34

4 ответа

Лучший ответ

Вы можете использовать массив # уменьшение, чтобы создать массив с элементами, размещенными в соответствии с их идентификаторами. Однако, если идентификаторы не являются непрерывными, вы получите разреженный массив (массив с дырками - undefineds).

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
1
Ori Drori 27 Авг 2017 в 13:57

На самом деле, так как массивы основаны на нуле, можно сделать:

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

Что приводит к

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

Так можно сделать

result[1]

Чтобы получить объект с идентификатором один.

0
Jonas Wilms 27 Авг 2017 в 12:52

Если вы не уверены, будут ли идентификаторы идеально последовательными 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;
};
0
Zevgon 27 Авг 2017 в 13:01

Используйте sort метод. Неважно, какие у вас Id.

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);
6
shukshin.ivan 27 Авг 2017 в 14:41