Как прервать многоуровневый цикл js

Прервать цикл for можно и с помощью ключевого слова return :
В данном примере функция findNumber ищет заданное число в массиве numbers . Если число найдено, функция возвращает строку с его позицией в массиве, используя оператор return , который прерывает выполнение цикла. Если число не найдено, функция также возвращает строку, но уже без позиции числа в массиве. Прерывание цикла через return позволяет избежать лишних итераций, что повышает производительность кода.

Чтобы прервать выполнение многоуровневого цикла, можно использовать оператор breake , разместив его во внешнем цикле:
Как только условие выполнится, выполнение цикла будет прервано и выполнение кода продолжается с конструкции, следующей за циклом.
Как прервать многоуровневый цикл for?
есть многоуровневый цикл for.
задача: на «нижнем» уровне при выполнении условия прервать работу цикла.
Пример:
Есть два массива чисел, нужно сложить каждое числа из первого, с каждым из второго. Если сумма равно 333. останавливаемся.
«Первый брейк» отрабатывает корректно, и цикл
for y in string1:
останавливается. однако цикл «верхнего» уровня продолжает отрабатывать.
при исполнении выглядит это вот так
Кто знает как прервать циклы подобного рода. Или есть иные варианты(команды тире функции)?
- Вопрос задан более двух лет назад
- 250 просмотров
- Вконтакте
Спасибо добрым людям.
Варик 1
Делаем ключ внутри функции и относительно его «пляшем»
Варик 2
Делаем отдельную функцию, если условие выполняется то вызываем прерывание
Циклы в JavaScript

Циклы – это простой способ для многократного выполнения одних и тех же действий (кода).
При этом однократное выполнения кода в цикле называется итерацией .
В JavaScript существуют различные виды циклов, но все они, по сути, делают одно и тоже. Просто с помощью одних циклов более просто решаются одни задачи, с помощью других – иные:
Цикл for
Данный цикл в основном используется когда известно точное количество повторений. Этот цикл ещё называют циклом со счётчиком.
Синтаксис цикла «for»:

Основные части конструкции цикла «for»:
- инициализация — это выражение, которое выполняется один раз перед выполнением цикла; обычно используется для инициализации счётчика;
- условие — это выражение, истинность которого проверяется перед каждой итерацией; если выражение вычисляется как истина , то выполняется итерация; в противном случае цикл «for» завершает работу;
- финальное выражение — это выражение, которое выполняется в конце каждой итерации; обычно используется для изменения счетчика;
- тело цикла — инструкции, выполнение которых нужно повторять.
Рассмотрим пример цикла, который выведет в консоль числа от 1 до 8:
- инициализация: var i = 1 (объявление переменной i и присвоение ей значения 1);
- условие выполнения цикла: i <= 8 (пока значение переменной i меньше или равно 8);
- финальное выражение, которое нужно выполнять в конце каждой итерации: i++ (увеличение значение переменной i на 1);
- инструкция, которую нужно выполнять: console.log(i) (выведение значения счётчика в консоль).
При этом если тело цикла состоит из одной инструкции, то её можно не заключать в фигурные скобки .
Таким образом, пример, приведённый выше, можно записать ещё так:
Необязательные части цикла «for».
В «for» все части цикла являются не обязательными.
Например, можно пропустить выражение инициализации:
В этом случае инициализацию переменной можно вынести за пределы цикла.
Условие в «for» тоже является не обязательным. Без условия цикл будет выполняться бесконечное количество раз. В этом случае чтобы его прервать (выйти из цикла) необходимо использовать инструкцию break .
Финальное выражение в «for» также является не обязательным. Счётчик цикла в этом случае можно, например, изменять в теле.
В «for» можно вообще опустить 3 выражения (бесконечный цикл):
Кроме этого, в качестве тела цикла «for» можно использовать пустое выражение ( ; ). Это используется, когда вам не нужно выполнять ни одной инструкции.
Пустое выражение в этом случае рекомендуется дополнительно снабжать комментарием:
Пример использования цикла «for» для перебора элементов массива:
Пример, в котором выведем таблицу умножения в консоль. Для реализации этого примера будем использовать вложенные циклы.

Цикл называется вложенным, если он находится в теле другого цикла.
Цикл while
Данный цикл предназначен для многократного выполнения одних и тех же инструкций до тех пор, пока истинно некоторое условие. Цикл «while» в основном используется, когда количество повторений заранее не известно.

Истинность условия проверяется перед каждым выполнением. Если перед первой итерацией условие ложно, то цикл не выполнится ни разу.
Пример, в котором выведем в консоль чётные числа в диапазоне от 1 до 8:
Цикл do. while
Цикл «do. while», также как и цикл «while», выполняет одни и те же инструкции до тех пор, пока указанное условие истинно. Но в отличие от «while» в «do. while» условие проверяется после выполнения инструкций. Поэтому цикл «do. while» в любом случае выполнится не меньше одного раза, даже если условие изначально ложно.

Пример, в котором выведем в консоль сумму чисел, которые будем запрашивать у пользователя с помощью функции prompt :
Цикл for. in
Цикл «for. in» предназначен для перебора перечисляемых имён свойств объекта. В JavaScript свойство является перечисляемым, если его внутренний флаг [[Enumerable]] равен true .
Свойства объекта, которые не относятся к перечисляемым, в цикле не участвуют.
Например, объект (массив) созданный с использованием функции-конструктора Array или его литеральной записи имеет не перечисляемые свойства от Array.prototype и Object.prototype , такие как indexOf() , some() , toString() и др. Они не будут участвовать в цикле.
Переберём свойства объекта, созданного с помощью литеральной записи:
Кроме этого, следует отметить, что цикл for. in проходит не только по перечисляемых свойствам этого объекта, но и по наследуемым.
Если вам наследуемые свойства не нужно учитывать, то их можно пропустить:
Использование цикла for. in для перебора массива. В массиве свойствами являются числовые индексы.
Цикл for. in проходит по свойствам в произвольном порядке. Поэтому если при переборе массива для вас важен порядок символов, то данный цикл лучше не использовать.
При использовании цикла for…in стоит обратить внимание на то, что если вы к массиву добавили свои пользовательские свойства, то он по ним тоже пройдётся:
Если вам такой сценарий не нужен, то тогда для перебора массивов лучше использовать обычный цикл for.
Использование цикла for…in для перебора символов в строке:
Инструкции break и continue
Внутри тела цикла можно использовать специальные инструкции: break и continue .
Инструкция «break» предназначена для прекращения выполнения текущего цикла . Другими словами, она осуществляет выход и передачу управления инструкции, идущей после этого цикла.
Пример, в котором завершим цикл по перебору элементов массива, если его текущий элемент не будет являться числом:
Инструкция «continue» предназначена для прекращения дальнейшего выполнения кода и перехода к следующей итерации цикла .
Пример, в котором найдём в слове «программирование» символы «а» и «о», и выведем их позиции в консоль:
Метки для break и continue
Метка представляет собой идентификатором с двоеточием, который необходимо указать перед циклом.
Далее после оператора break или continue необходимо указать эту метку:
Вызов break someLabel приведёт к переходу в конец цикла, перед которым данная метка указана .
Если метка используется с ключевым словом continue , то в этом случае выполнение этого действия приведёт к немедленному переходу к следующей итерации цикла, перед которым данная метка указана.
В коде с одиночным циклом использование метки не даст никакого результата. Её есть смысл использовать только когда вам нужно выйти сразу из нескольких циклов.
Пример, в котором выйдем сразу из 2 циклов, когда произведение значений переменных-счётчиков даст число большее 10.
Кроме этого, операторы break и continue нельзя использовать в выражениях тернарных операторов.
Цикл for. of (новинка в ES6)
Цикл for. of появился в стандарте ES6. Предназначен он для перебора итерируемых объектов , т.е. объектов, в которых реализован метод Symbol.iterator . Этот метод ещё называют итератором . Именно его и использует цикл for. of для перебора объектов.
Метод Symbol.iterator имеется у String , Array , Map , Set , arguments , NodeList и других объектов.
Пример использование цикла for. of для посимвольного перебора строки:
Пример использование цикла for. of для перебора коллекции DOM-элементов:
Пример использование цикла for. of для перебора массива:
Чем цикл for. of отличается от for. in
Первое отличие цикла for. of от for. in заключается в том, что он может применяться только для итерируемым объектов, т.е. объектов, в которых реализован итератор ( Symbol.iterator ). Цикл for. in итератор не использует. Он предназначен для перебора любых объектов.
Второе отличие заключается в том, что цикл for. of перебирает объект так, как это определено в итераторе. Например, в Array итератор реализован так, что цикл for. of пройдёт только по значениям в массиве и не будет включать в перебор другие (не индексные) свойства. Цикл for. in организован по-другому, он перебирает все перечисляемые свойства (имена ключей) объекта, в том числе и наследуемые.
Рассмотрим эти отличия. Для этого возьмём предыдущий пример и добавим к нему пользовательское свойство, например, hero и установим ему значение ‘Wasp’ .
При использовании for. of он переберёт все значения этого массива:
При использовании for. in он переберёт все перечисляемые имена ключей этого объекта:
Чтобы получить значение ключа по его имени можно воспользоваться квадратными скобками:
Самостоятельное создание итератора для объекта
Рассмотрим ещё один пример. В этом примере мы самостоятельно определим как должен итерироваться объект. Для этого создадим объект и определим ему итератор.
Создание итератора начинается с добавления к объекту специального метода. Этот метод необходимо спроектировать так, чтобы он возвращал значения последовательно (одно за другим). Название методу согласно стандарту необходимо определить с помощью символа Symbol.iterator . Итератор должен возвращать всего один метод next() . Этот метод в свою очередь тоже должен возвращать объект, состоящий из 2 свойств: value и done . Ключ done — булевый. Он определяет есть ли ещё значения в последовательности ( false — да, true — нет). Ключ value должен содержать следующее значение последовательности.
Задачи по циклам
1. Написать с помощью цикла while «переворот» числа. Другими словами, нужно создать новое число, у которого цифры шли бы в обратном порядке (например: 472 -> 274).
Как разбить вложенные циклы в JavaScript? [дубликат]

Вам нужно назвать внешний цикл и разорвать его, а не внутренний цикл — вот так.
ответ дан 14 окт ’09, 08:10

Вау, я не знал, что мы можем давать названия петлям, отличная информация! +1 — хорошо
@okw: ты не называешь цикл. Вы просто обозначаете позицию в источнике. — xtofl
Никогда не знал, что JavaScript поддерживает ярлыки. Интересно, почему я никогда раньше этого не видел. : O — Натан Тейлор
@xtofl: Не совсем так. Вы связываете метку с оператором (который может быть циклом), помещая его непосредственно перед. Это полезно только с оператором блока, поскольку метка доступна только с операторами break и continue внутри блока. — Тим Даун
@NickFitz: вы могли бы привести аргумент в пользу производительности. В случае вложенных циклов метки могут быть полезны для выхода из внешнего цикла. Хотя он может быть более элегантным и модульным, чтобы избежать вложенных циклов, перемещая внутренние циклы для разделения функций, он будет работать немного медленнее из-за дополнительных вызовов функций. — Тим Даун
См. Аарона. В противном случае: j=5;i=5 вместо break .
ответ дан 14 окт ’09, 08:10
Это просто лучшее и самое чистое решение. Не возвращайтесь к этикеткам, они ужасно выглядят. — Педро Морейра
Это уродливо. for(i=0;i<5;i++) предполагается запустить 5 раз. Обновление i вне оператора цикла заставляет его вести себя неожиданным образом. — Флориан Ф
Уродливое — это субъективно. Предполагается, что цикл запускается столько раз, сколько вы хотите. Вопрос заключался в том, как разорвать двойной цикл for, в котором ни j, ни i не достигают 5. Единственная техническая причина для предпочтения моего против «брейк-данса» — это случай, когда вы хотите, чтобы i / j показывал завершение (== 5 ) против незавершенных (== <5) пост-циклов. — Гленн
Согласитесь с @FlorianF, это уродливо в том смысле, что это кажется более подверженным ошибкам решением, чем добавление метки, хотя у меня нет никаких статистических доказательств этого. Независимо от того, привыкли ли вы к ярлыкам или нет, они, конечно, не безошибочная концепция, но жесткие коды кодирования, которые вам нужно изменить в нескольких местах, если что-то изменится, — это ужасный стиль программирования. Что касается оценки, это справедливое заявление, помогающее определить лучший ответ для OP. — Мануэль
@Manuel: re: «ужасный стиль программирования». Вы можете использовать константы и т. Д. Для чисел в обоих местах, но это не имеет отношения к вопросу. Поскольку на этот вопрос ответили в 2009 году, сегодня я бы сказал, что вам следует переписать код, чтобы не использовать цикл for. (фильтровать, уменьшать, отображать и т. д.) — Гленн
Пожалуйста, поищите перед тем, как задать вопрос. Ссылка была ПЕРВЫМ вопросом, который я увидел в левой части страницы!
ответ дан 23 мая ’17, 13:05
Есть как минимум пять разных способов выйти из двух или более петель:
1) Установить родительский цикл (ы) в конец
2) Используйте этикетку
3) Использовать переменную
4) Использовать самоисполняющуюся функцию
5) Используйте обычную функцию

Весь смысл многоуровневого перерыва в том, чтобы избежать №3. — Уик
К сожалению, вам придется установить флаг или использовать ярлыки (подумайте о старых инструкциях goto)
Подход с использованием этикеток выглядит так:
изменить: метка размещена неправильно.
ответ дан 08 авг.

Значит, этикетка не может идти за разрывом, правильно? Скажем так, хорошо, какое-то условие было выполнено, мне вообще не нужны циклы. Можно ли сделать переход к метке, объявленной после циклов? — орел
На мой взгляд, важно сводить словарный запас по конструктам к минимуму. Если я могу избавиться от перерывов и легко продолжу, я так и сделаю.
Имейте в виду, что после цикла m и k на единицу больше, чем вы могли подумать. Это потому, что m ++ и k ++ выполняются до своих условий цикла. Однако это все же лучше, чем «грязные» перерывы.
РЕДАКТИРОВАТЬ: длинный комментарий @Dennis .
Я не на 100% серьезно относился к тому, чтобы быть «грязным», но я все же считаю, что «перерыв» противоречит моей собственной концепции чистого кода. Мысль о многоуровневых перерывах на самом деле вызывает у меня желание принять душ.
Я считаю оправданным то, что я имею в виду под чувством кода, потому что я программировал всю жизнь. Лучшее, что я могу придумать, — это сочетание манер и грамматики. Перерывы просто не вежливы. Многоуровневые перерывы — это просто грубость.
Глядя на оператор for, читатель точно знает, где искать. Все, что вам нужно знать о правилах участия, заключено в контракте между скобками. Меня, как читателя, оскорбляют, такое ощущение, что меня обманули.