var myArr = [{a:1, b:2}, {c:3, d:4}];
for (var item in myArr) {
console.log(item);
}
Элемент возвращает ключ (ex: 0, 1) вместо самого объекта. Почему?
var myArr = [{a:1, b:2}, {c:3, d:4}];
for (var item in myArr) {
console.log(item);
}
Элемент возвращает ключ (ex: 0, 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]);
}
Невозможно получить имя свойства, если мы будем использовать для каждого цикла для указанного объекта.
Примечание:
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] );
}
Цикл for
... in
выполняет итерацию по ключам (свойствам) объекта.
Он не предназначен для использования в массивах.
Он также будет перебирать свойства, унаследованные от объекта prototype
.
Добавление ответа здесь для размещения последнего стандарта 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);
}
Зачем переименовывать переменную? Ну, хотя мы используем термин "элемент" для обозначения любого общего элемента в массиве, ваш массив содержит только объекты. Если вы знаете или ожидаете, что этот массив относится только к всем содержащимся объектам, вы можете назвать переменную на основе типа элемента (т.е. Объекта), который содержит массив.
Счастливое кодирование!