Я пробовал это:
for(i = 0; i < 5; i++){
for(j = i + 1; j < 5; j++){
break(2);
}
alert(1);
}
только чтобы получить:
SyntaxError
: отсутствует;
перед оператором
Итак, как мне разорвать вложенный цикл в JavaScript?
Я пробовал это:
for(i = 0; i < 5; i++){
for(j = i + 1; j < 5; j++){
break(2);
}
alert(1);
}
только чтобы получить:
SyntaxError
: отсутствует;
перед оператором
Итак, как мне разорвать вложенный цикл в JavaScript?
Вы должны иметь возможность разбить ярлык, например:
function foo () {
dance:
for (var k = 0; k < 4; k++) {
for (var m = 0; m < 4; m++) {
if (m == 2) {
break dance;
}
}
}
}
break
(буквально, как break 2
).
- person i336_; 16.03.2021
Вам нужно назвать внешний цикл и разорвать его, а не внутренний цикл - вот так.
outer_loop:
for(i=0;i<5;i++) {
for(j=i+1;j<5;j++) {
break outer_loop;
}
alert(1);
}
onclick:"javascript: doThis()"
не вызывает ошибки. javascript:
в этом случае считается ненужным ярлыком.
- person Juan Mendes; 29.12.2012
См. Аарона. В противном случае: j=5;i=5
вместо break
.
for(i=0;i<5;i++)
предполагается запустить 5 раз. Обновление i
вне оператора цикла заставляет его вести себя неожиданным образом.
- person Florian F; 12.11.2014
Есть как минимум пять разных способов выйти из двух или более петель:
1) Установить родительский цикл в конец
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
{
if (j === 2)
{
i = 5;
break;
}
}
}
2) Используйте ярлык
fast:
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
{
if (j === 2)
break fast;
}
}
3) Используйте переменную
var exit_loops = false;
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
{
if (j === 2)
{
exit_loops = true;
break;
}
}
if (exit_loops)
break;
}
4) Использовать самоисполняющуюся функцию
(function()
{
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
{
if (j === 2)
return;
}
}
})();
5) Используйте обычную функцию
function nested_loops()
{
for (i = 0; i < 5; i++)
{
for (j = 0; j < 5; j++)
{
if (j === 2)
return;
}
}
}
nested_loops();
loop1:
for (var i in set1) {
loop2:
for (var j in set2) {
loop3:
for (var k in set3) {
break loop2; // breaks out of loop3 and loop2
}
}
}
код скопирован из Лучший способ выйти из вложенных циклов в Javascript?
Пожалуйста, поищите перед тем, как задать вопрос. Ссылка была ПЕРВЫМ вопросом, который я увидел в левой части страницы!
К сожалению, вам придется установить флаг или использовать ярлыки (подумайте о старых инструкциях goto)
var breakout = false;
for(i=0;i<5;i++)
{
for(j=i+1;j<5;j++)
{
breakout = true;
break;
}
if (breakout) break;
alert(1)
};
Подход с использованием этикеток выглядит так:
end_loops:
for(i=0;i<5;i++)
{
for(j=i+1;j<5;j++)
{
break end_loops;
}
alert(1)
};
изменить: метка размещена неправильно.
также см:
На мой взгляд, важно сводить словарный запас по конструктам к минимуму. Если я могу избавиться от перерывов и легко продолжу, я так и сделаю.
function foo ()
{
var found = false;
for(var k = 0; (k < 4 && !found); k++){
for(var m = 0; (m < 4 && !found); m++){
if( m === 2){
found = true;
}
}
}
return found;
}
Имейте в виду, что после цикла m и k на единицу больше, чем вы могли подумать. Это потому, что m ++ и k ++ выполняются до своих условий цикла. Однако это все же лучше, чем «грязные» перерывы.
РЕДАКТИРОВАТЬ: длинный комментарий @Dennis ...
Я не на 100% серьезно относился к тому, чтобы быть «грязным», но я все же считаю, что «перерыв» противоречит моей собственной концепции чистого кода. Мысль о многоуровневых перерывах на самом деле вызывает у меня желание принять душ.
Я считаю оправданным то, что я имею в виду под чувством кода, потому что я программировал всю жизнь. Лучшее, что я могу придумать, - это сочетание манер и грамматики. Перерывы просто не вежливы. Многоуровневые перерывы - это просто грубость.
Глядя на оператор for, читатель точно знает, где искать. Все, что вам нужно знать о правилах участия, заключено в контракте между скобками. Меня, как читателя, оскорбляют, такое ощущение, что меня обманули.
Ясность гораздо более уважительна, чем обман.
break
или continue
. В этом случае вы можете просто вернуться, когда найдете совпадение.
- person Juan Mendes; 29.12.2012
Используйте функцию для многоуровневых циклов - это хороший способ:
function find_dup () {
for (;;) {
for(;;) {
if (done) return;
}
}
}
for(;;)
? Никогда раньше такого не видел.
- person Derek 朕會功夫; 25.02.2012
Оберните самоисполняющуюся функцию и верните
(function(){
for(i=0;i<5;i++){
for (j=0;j<3;j++){
//console.log(i+' '+j);
if (j == 2) return;
}
}
})()
Вы return
, чтобы "разорвать" вложенный вами for
цикл.
function foo ()
{
//dance:
for(var k = 0; k < 4; k++){
for(var m = 0; m < 4; m++){
if(m == 2){
//break dance;
return;
}
}
}
}
foo();
Вы можете разорвать вложенные циклы for с помощью слова "break", это работает без каких-либо ярлыков.
В вашем случае вам нужно иметь условие, достаточное для разрыва цикла.
Вот пример:
var arr = [[1,3], [5,6], [9,10]];
for (var a = 0; a<arr.length; a++ ){
for (var i=0; i<arr[a].length; i++) {
console.log('I am a nested loop and i = ' + i);
if (i==0) { break; }
}
console.log('first loop continues');
}
Он регистрирует следующее:
> I am a nested loop and i = 0
> first loop continues
> I am a nested loop and i = 0
> first loop continues
> I am a nested loop and i = 0
> first loop continues
Оператор return; в этом случае не работает. Рабочая ручка
Другой трюк - настроить родительский цикл так, чтобы он достиг конца, а затем прервал текущий цикл.
function foo()
{
for(var k = 0; k < 4; k++){
for(var m = 0; m < 4; m++){
if(m == 2){
k = 5; // Set this then break
break;
}
console.log(m);
}
}
}
break
не принимает параметров. Есть два обходных пути:
Оберните их в функцию и вызовите return
Установите флаг во внутреннем цикле и снова прервите цикл сразу после цикла, если этот флаг установлен.
Разрыв 1-й петли:
for(i=0;i<5;i++)
{
for(j=i+1;j<5;j++)
{
//do something
break;
}
alert(1);
};
Обе петли оборвать:
for(i=0;i<5;i++)
{
var breakagain = false;
for(j=i+1;j<5;j++)
{
//do something
breakagain = true;
break;
}
alert(1);
if(breakagain)
break;
};
goto
не является зарезервированным словом в JavaScript: ReferenceError: goto is not defined
- person Derek 朕會功夫; 25.02.2012
alert(1)
. - person Nathan Taylor   schedule 14.10.2009