[1,2,3].forEach(function(el) {
if(el === 1) break;
});
Как я могу сделать это, используя новый forEach
метод в JavaScript? Я пытался return;
, return false;
и break
. break
падает и return
ничего не делает, кроме продолжения итерации.
javascript
arrays
Скотт Кларенбах
источник
источник
return
итерация действительно продолжается, она пропускает любой код, следующий за ним в блоке. Возьмите этот код, например:[1,2,3].forEach(function(el) { if(el === 2) { console.log(`Match on 2!`); return; } console.log(el); });
.Theconsole.log(el);
будет пропущен, когда 2 соответствует.Ответы:
Там нет встроенной способности
break
вforEach
. Чтобы прервать выполнение, вам нужно было бы выдать какое-то исключение. например.Исключения в JavaScript не очень красивые. Традиционный
for
цикл может быть более уместным, если вам действительно нужноbreak
внутри него.использование
Array#some
Вместо этого используйте
Array#some
:Это работает, потому что
some
возвращает,true
как только любой из обратных вызовов, выполненных в порядке массива, возвращаетсяtrue
, замыкая выполнение остальных.some
, его обратныйevery
(который остановится на areturn false
), иforEach
все методы пятого издания ECMAScript, которые необходимо добавить вArray.prototype
браузеры, где они отсутствуют.источник
some
иevery
, это должно быть в ТОПе в ответе. Не могу понять, почему люди думают, что это менее читабельно. Это просто потрясающе!Array#some
действительно приятно. Во-первых, он совместим с большинством браузеров, включая ie9 и firefox 1.5, также работает очень хорошо. Мой пример использования будет заключаться в том, чтобы найти индекс в массиве диапазонов [a, b], где число находится между нижней границей и парой верхней границы, проверить и вернуть true, когда найден.for..of
будет следующим лучшим решением, хотя только для новых браузеров.Теперь в ECMAScript2015 (он же ES6) есть еще лучший способ сделать это с использованием нового цикла for . Например, этот код не печатает элементы массива после числа 5:
Из документов:
Нужен индекс в итерации? Вы можете использовать
Array.entries()
:источник
entries
. for (const [index, element] of someArray.entries ()) {// ...}Object.entries(myObject)
а затем использовать его точно так же, как вы используетеfor..in
для массива. Обратите внимание, что массивы JS в основном являются объектами под капотом: blog.niftysnippets.org/2011/01/myth-of-arrays.htmlВы можете использовать любой метод:
ES6
для поддержки старых браузеров используйте:
подробнее здесь .
источник
[1,2,3].every( el => el !== 1 )
every
гарантирует ли, что звонки выполняются последовательно?k
начинается с 0 и увеличивается на 1: http://www.ecma-international.org/ecma-262/6.0/#sec-array.prototype.every.Цитирование из документации MDN
Array.prototype.forEach()
:Для вашего кода (в вопросе), как предложено @bobince, используйте
Array.prototype.some()
вместо этого. Это очень хорошо подходит для вашего использования.источник
К сожалению, в этом случае будет намного лучше, если вы не используете
forEach
. Вместо этого используйте обычныйfor
цикл, и теперь он будет работать точно так, как вы ожидаете.источник
Рассмотрим использование
jquery
«seach
метод, так как он позволяет вернуть ложную функцию обратного вызова внутри:Библиотеки Lodash также предоставляют
takeWhile
метод, который может быть связан с map / lower / fold и т.д .:источник
Из вашего примера кода это выглядит как
Array.prototype.find
то, что вы ищете: Array.prototype.find () и Array.prototype.findIndex ()источник
Если вы хотите использовать предложение Дина Эдварда и выбросить ошибку StopIteration, чтобы выйти из цикла без необходимости перехвата ошибки, вы можете использовать следующую функцию ( изначально отсюда ):
Приведенный выше код даст вам возможность запускать код, подобный следующему, без необходимости создавать собственные предложения try-catch:
Важно помнить, что функция Array.prototype.forEach будет обновляться только в том случае, если она уже существует. Если он еще не существует, он не изменит его.
источник
Краткий ответ: используйте
for...break
для этого или измените свой код, чтобы избежать взломаforEach
. Не используйте.some()
или.every()
подражатьfor...break
. Перепишите свой код, чтобы избежатьfor...break
зацикливания, или используйтеfor...break
. Каждый раз, когда вы используете эти методы в качествеfor...break
альтернативы, Бог убивает котенка.Длинный ответ:
.some()
и.every()
оба возвращаютboolean
значение,.some()
возвращает,true
если есть какой-либо элемент, для которого возвращается переданная функцияtrue
, каждый возвращает,false
если есть какой-либо элемент, для которого возвращается переданная функцияfalse
. Вот что означают эти функции. Использование функций для того, что они не имеют в виду, гораздо хуже, чем использование таблиц для разметки вместо CSS, потому что это расстраивает всех, кто читает ваш код.Кроме того, единственный возможный способ использовать эти методы в качестве
for...break
альтернативы - создать побочные эффекты (изменить некоторые переменные вне.some()
функции обратного вызова), и это мало чем отличается отfor...break
.Таким образом, использование
.some()
или.every()
какfor...break
альтернатива цикла не свободна от побочных эффектов, это не намного чище, чемfor...break
, это расстраивает, так что это не лучше.Вы всегда можете переписать свой код так, чтобы в нем не было необходимости
for...break
. Вы можете фильтровать массив с помощью.filter()
, вы можете разделить массив с помощью.slice()
и так далее, затем использовать.forEach()
или.map()
для этой части массива.источник
for...break
цикл, если вам нужна производительность.for
петля является наиболее производительным инструментом итерации , чем.forEach()
,.any()
,.map()
, и.filter()
т.д.Это просто то, что я придумал, чтобы решить проблему ... Я почти уверен, что это решает проблему, которая была у оригинального аскера:
И тогда вы бы назвали это с помощью:
Возврат false внутри функции обратного вызова вызовет разрыв. Дайте мне знать, если это не сработает.
источник
=== false
это может быть лучше, чем то,== false
что вам не нужно явно возвращать true (или истинное значение), чтобы продолжить цикл, иначе какой-то путь управления не вернет значение и цикл неожиданно прервется.Еще одна концепция, которую я придумал:
источник
Array.prototype.forEach()
.for
иbreak
существовал задолго до того, как был задан этот вопрос; ОП искал такое поведение, используя более функциональныйforEach
.for...in
иbreak
.источник
Нашел это решение на другом сайте. Вы можете обернуть forEach в сценарий try / catch.
Подробнее здесь: http://dean.edwards.name/weblog/2006/07/enum/
источник
Если вам не нужен доступ к вашему массиву после итерации, вы можете выручить, установив длину массива равной 0. Если вам все еще нужно это после итерации, вы можете клонировать его с помощью слайса.
Или с клоном:
Это гораздо лучшее решение, чем случайные ошибки в вашем коде.
источник
array.length
на0
они будут применяться в текущей итерации, так что, вероятно , это иногда лучше использоватьreturn
после такого присвоившейЭто цикл for, но он поддерживает ссылку на объект в цикле, как и forEach (), но вы можете выйти из него.
источник
Как упоминалось ранее, вы не можете сломаться
.forEach()
.Вот немного более современный способ создания foreach с помощью итераторов ES6. Позволяет получить прямой доступ к
index
/value
при итерации.Вывод:
связи
Array.prototype.entries()
источник
Еще один подход
источник
Я использую nullhack для этой цели, он пытается получить доступ к свойству
null
, что является ошибкой:источник
throw BREAK
?Если вы хотите сохранить свой
forEach
синтаксис, это способ сохранить его эффективность (хотя и не так хорошо, как обычный цикл for). Немедленно проверьте переменную, которая знает, хотите ли вы выйти из цикла.В этом примере используется анонимная функция для создания области действия, вокруг
forEach
которой вам нужно хранить готовую информацию.Мои два цента.
источник
Я знаю это не правильно. Это не разорвать петлю. Это джугад
источник
Используйте
array.prototype.every
функцию, которая предоставит вам утилиту для разрыва цикла. Смотрите пример здесь документации Javascript в сети разработчиков Mozillaисточник
Согласитесь с @bobince, проголосовал.
Кроме того, к вашему сведению:
В Prototype.js есть что-то для этого:
$break
будет перехватываться и обрабатываться внутренним Prototype.js, прерывая цикл «каждый», но не генерируя внешних ошибок.См. Prototype.JS API для деталей.
У jQuery также есть способ, просто верните false в обработчик, чтобы разорвать цикл раньше:
Смотрите jQuery API для подробностей.
источник
Это не самый эффективный способ, так как вы по-прежнему переключаете все элементы, но я подумал, что стоит подумать об очень простом:
источник
continue
является ключевым словом, ваш код является синтаксической ошибкой.for of
цикл иbreak;
, как обычно, делать это .Вы можете следовать приведенному ниже коду, который работает для меня:
источник
Я предпочитаю использовать
for in
for in
работает так же, какforEach
, и вы можете добавить функцию возврата к выходу внутри. Лучшая производительность тоже.источник
Если вам нужно разбить на основе значений элементов, которые уже есть в вашем массиве, как в вашем случае (т.е. если условие разрыва не зависит от переменной времени выполнения, которая может измениться после присвоения массиву значений его элементов), вы также можете использовать комбинацию из среза () и IndexOf () следующим образом .
Если вам нужно сломать, когда forEach достигает «Apple», вы можете использовать
Как сказано в W3Schools.com метод slice () возвращает выбранные элементы в массиве как новый объект массива. Исходный массив не будет изменен.
Смотрите это в JSFiddle
Надеюсь, это кому-нибудь поможет.
источник
Вы можете создать вариант из
forEach
что позволяетbreak
,continue
,return
и дажеasync
/await
(например , написанные в машинописи)Применение:
источник
попробуйте с "найти":
источник
Да, можно продолжить и выйти из цикла forEach.
Чтобы продолжить, вы можете использовать return, цикл продолжится, но текущая функция завершится.
Чтобы выйти из цикла, вы можете установить третий параметр равным 0 длины, установить пустой массив. Цикл не будет продолжаться, текущая функция делает, так что вы можете использовать «возврат» для завершения, как выход в нормальном для цикла цикла ...
Эта:
напечатает это:
источник
Раньше мой код был ниже
Я изменил ниже, это было исправлено.
источник