Внимание:
Вопрос по-прежнему относится к
for…of
циклам.> Не используйтеfor…in
для итерации по массиву , используйте его для итерации по свойствам объекта. Тем не менее, это
Я понимаю, что основной for…in
синтаксис в JavaScript выглядит так:
for (var obj in myArray) {
// ...
}
Но как мне получить счетчик / индекс цикла ?
Я знаю, что мог бы сделать что-то вроде:
var i = 0;
for (var obj in myArray) {
alert(i)
i++
}
Или даже старый добрый
for (var i = 0; i < myArray.length; i++) {
var obj = myArray[i]
alert(i)
}
Но я бы предпочел использовать более простой for-in
цикл. Я думаю, что они выглядят лучше и имеют больше смысла.
Есть ли более простой или более элегантный способ?
В Python это просто:
for i, obj in enumerate(myArray):
print i
javascript
for-loop
foreach
counter
hobbes3
источник
источник
alert(obj)
?Ответы:
for…in
перебирает имена свойств, а не значения, и делает это в неопределенном порядке (да, даже после ES6). Вы не должны использовать его для перебора массивов. Для них естьforEach
метод ES5, который передает значение и индекс функции, которую вы ему передаете:Или ES6
Array.prototype.entries
, которые теперь поддерживают текущие версии браузеров:Однако для итерируемых элементов вообще (где вы бы использовали
for…of
цикл вместо afor…in
) ничего встроенного нет:демонстрация
Если вы действительно имели в виду
for…in
- перечисление свойств - вам понадобится дополнительный счетчик.Object.keys(obj).forEach
может работать, но включает только собственные свойства;for…in
включает перечисляемые свойства в любом месте цепочки прототипов.источник
let
svar
с областью блока.const
с неизменны.%d
форматирует целое число и%s
форматирует строку. Они основаны на printf . Спецификация выполняется в console.spec.whatwg.org/#formatter .В ES6 это хорошо использовать для - цикла. Вы можете получить индекс для как это
Обратите внимание, что
Array.entries()
возвращается итератор , который позволяет ему работать в цикле for; не путайте это с Object.entries () , который возвращает массив пар ключ-значение.источник
entries()
возвращается пустой объект:{}
. Есть идеи, почему это будет? Мояarray
это массив объектов.Object.entries(array)
вместоarray.entries()
next()
методом, который будет возвращать последующие записи в массиве каждый раз, когда он вызывается. Там нет (видимых) данных в нем; Вы получаете данные в базовом объекте путем вызоваnext()
, что for-of делает за кулисами. куб.см @tonygКак насчет этого
Где
array.forEach
этот метод имеетindex
параметр, который является индексом текущего элемента, обрабатываемого в массиве.источник
break
как недоступен.Решение для небольших коллекций массивов:
arr - ARRAY, obj - ключ текущего элемента, i - COUNTER / INDEX
Примечание: Ключ метода () недоступен для IE версии <9, вы должны использовать код Polyfill . https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
источник
var i = 0;
иi++;
короче и эффективнее. Плюс это не работает для перечисляемых свойств, которые не являются собственными свойствами.Циклы for-in-loop перебирают свойства объекта. Не используйте их для массивов, даже если они иногда работают.
Свойства объекта в этом случае не имеют индекса, все они равны и не должны просматриваться в определенном порядке. Если вы хотите посчитать свойства, вам нужно установить дополнительный счетчик (как вы это делали в первом примере).
цикл по массиву:
цикл по объекту:
источник
(var i=0; i<a.length; i++)
как потраченные впустую ресурсы. Использование(var i=0, var len = a.length; i<len; i++)
var i=0; i<a.length; i++)
это стандартный шаблон цикла, который в любом случае оптимизируется каждым приличным движком javascript.var i=0; i<a.length; i++
это лучшая практика.Как уже говорили другие, вы не должны использовать for..in для перебора массива.
Если вы хотите более чистый синтаксис, вы можете использовать forEach:
Если вы хотите использовать этот метод, убедитесь, что вы включили шайбу ES5 для добавления поддержки старых браузеров.
источник
Ответ от rushUp верен, но это будет удобнее
источник
Вот функция,
eachWithIndex
которая работает с чем угодно итеративным.Вы также можете написать аналогичную функцию,
eachWithKey
которая работает с использованием объектовfor...in
.Хорошая вещь с генераторами - то, что они ленивы и могут взять результат другого генератора в качестве аргумента.
источник
Это моя версия составного итератора, который возвращает индекс и значение любой переданной функции генератора с примером (медленного) простого поиска:
источник
eachWithIndex[Symbol.iterator]
а не просто функцияeachWithIndex
?eachWithIndex
не удовлетворяет итерируемый интерфейс, в чем и заключается весь смыслSymbol.iterator
.eachWithIndex
для принятия итерируемого и возврата закрытого составного итерируемого.В дополнение к очень хорошим ответам, которые все опубликовали, я хочу добавить, что наиболее эффективным решением является ES6
entries
. Для многих разработчиков это кажется нелогичным , поэтому я создал этот тестовый стенд .Это ~ в 6 раз быстрее. Главным образом потому, что не нужно: а) обращаться к массиву более одного раза и б) приводить индекс.
источник