Проблема реверса массива объектов с помощью JS - PullRequest
4 голосов
/ 14 марта 2012

Я анализирую JSON и получаю массив объектов с помощью JavaScript.Я делал это, чтобы затем добавить элемент для каждого объекта:

for(o in obj){ ... }

Но я понял, что для определенной ситуации я хочу вернуться назад через массив.Поэтому я попробовал это перед циклом for:

obj = obj.reverse();

Однако это не меняет порядок объектов в массиве.Я мог бы просто поместить переменную count в цикл for, чтобы вручную получить реверс, но я озадачен, почему реверс не работает с массивами объектов.

Ответы [ 2 ]

10 голосов
/ 14 марта 2012

В JavaScript нет такой вещи, как "массив объектов".Есть Объекты, и есть Массивы (которые, конечно, также являются Объектами).У объектов есть свойства, и свойства не упорядочены каким-либо определенным образом.

Другими словами, если вы получили:

var obj = { a: 1, b: 2, c: 3 };

, нет никакой гарантии, что цикл for ... in посетитсвойства в порядке "a", "b", "c".

Теперь, если у вас есть массив объектов , например:

var arr = [ { a: 1 }, { b: 2 }, { c: 3 } ];

тогда это обычный массив, и вы можете изменить его.Метод .reverse() мутирует массив, поэтому его нельзя переназначать.Если у вас do есть массив объектов (или реальный массив значений любого типа), то вы должны , а не использовать for ... in для его итерации.Используйте числовой индекс.

edit - в полезном комментарии указано, что .reverse() возвращает ссылку на массив, поэтому переназначение ничего не повредит.

2 голосов
/ 14 марта 2012

Это потому, что for (o in obj) не повторяет массив как массив, а как объект.Он повторяет свойства в объекте, который также включает элементы в массиве, но они повторяются в порядке имен, а не в порядке, в котором вы поместили их в массив.

Кроме того, вы используете reverse метод неверный.Он переворачивает массив на месте, поэтому не используйте возвращаемое значение:

obj.reverse();
...