Подтвердить что ты не робот

Итерация по массиву объектов javascript - нечетное поведение?

var myArr = [{a:1, b:2}, {c:3, d:4}];

for (var item in myArr) {
    console.log(item);
}

Элемент возвращает ключ (ex: 0, 1) вместо самого объекта. Почему?

4b9b3361

Ответ 1

Дуглас Крокфорд рекомендует в JavaScript: Хорошие части, чтобы избежать использования инструкции for in.

Если вы используете for in для перебора имен свойств в объекте, результаты не упорядочены.

Цикл for in лучше всего подходит для итерации по парам имя-значение, а цикл for each лучше всего подходит для итерации над значениями i.e массивов.

например,

var o = {'name':'Batman', 'age':33, 'city':'Gotham City'};
   for (var p in o) {
        console.log(p+': '+o[p]);
    }

Невозможно получить имя свойства, если мы будем использовать для каждого цикла для указанного объекта.


Примечание:

  • For in Loop лучше всего подходит для пар имя-значение.
  • Для каждого цикла лучше всего использовать итерируемые значения. Например: массивы и объекты, если вас не интересует имя свойства.

Ответ 2

Javascript for.. in циклы всегда возвращают индекс/имя, а не значение. Чтобы получить то, что вы хотите, вы должны использовать

var myArr = [{a:1, b:2}, {c:3, d:4}];

for (var index in myArr) {
    console.log( myArr[index] );
}

Однако, как говорилось ранее, оператор for.. in следует использовать с осторожностью, а его не намерен использовать с массивом. Вы должны вместо for использовать

var myArr = [{a:1, b:2}, {c:3, d:4}];

for( var i=0, l=myArr.length; i<l; i++ ) {
    console.log( myArr[i] );
}

Ответ 3

Цикл for... in выполняет итерацию по ключам (свойствам) объекта.
Он не предназначен для использования в массивах.

Он также будет перебирать свойства, унаследованные от объекта prototype.

Ответ 4

Добавление ответа здесь для размещения последнего стандарта ECMAScript 6.

Откроется эта страница для отличного чтения с примерами.

И довольно вкусное предостережение: эта потрясающая новая функциональность будет работать с почти всегда повторяющимся объектом! Из MDN:

Оператор for... создает цикл, повторяющийся по итерируемым объектам (включая Array, Map, Set, String, TypedArray, объект аргументов и так далее)...

Так, например, вы можете использовать:

for (let item of myArr) {
    console.log(item);
} 

Несмотря на то, что для того, чтобы убедиться, что вы регистрируете объект, мне было бы немного лучше, чтобы следующий человек прочитал ваш код, переименовав "item" в "obj", создав это:

for (let obj of myArr) {
    console.log(obj);
} 

Зачем переименовывать переменную? Ну, хотя мы используем термин "элемент" для обозначения любого общего элемента в массиве, ваш массив содержит только объекты. Если вы знаете или ожидаете, что этот массив относится только к всем содержащимся объектам, вы можете назвать переменную на основе типа элемента (т.е. Объекта), который содержит массив.

Счастливое кодирование!