Как разбить вложенные циклы в JavaScript?
Я попытался это:
for(i = 0; i < 5; i++){
for(j = i + 1; j < 5; j++){
break(2);
}
alert(1);
}
только к вам:
SyntaxError
: отсутствует;
перед заявлением
Итак, как бы я сломал вложенный цикл в JavaScript?
15 ответов:
вы должны быть в состоянии разбить на этикетке, например, так:
function foo () { dance: for(var k = 0; k < 4; k++){ for(var m = 0; m < 4; m++){ if(m == 2){ break dance; } } } }
вам нужно назвать ваш внешний цикл, и разорвать этот цикл, а не ваш внутренний цикл - такой.
outer_loop: for(i=0;i<5;i++) { for(j=i+1;j<5;j++) { break outer_loop; } alert(1); }
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 statements)
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++ выполняются до их условий цикла. Тем не менее, это все же лучше, чем "грязные" перерывы.
EDIT: длинный комментарий @Dennis...
Я не был на 100% серьезен о том, чтобы быть "грязным", но я все еще думаю этот "перерыв" противоречит моей собственной концепции чистого кода. Мысль о многоуровневых перерывах на самом деле заставляет меня чувствовать себя как в душе.
Я нахожу оправдание тому, что я имею в виду о чувстве кода, потому что я закодировал всю жизнь. Лучшее, почему я могу думать об этом, - это сочетание манер и грамматики. Перерывы просто невежливы. Многоуровневые перерывы просто грубые.
при просмотре оператора for читатель точно знает, где искать. Все, что вам нужно узнать о правилах участия в договоре, в скобках. Как читатель, разрывы оскорбляют меня, кажется, что меня обманули.
ясность гораздо более уважительна, чем обман.
оберните в самоисполняющуюся функцию и верните
(function(){ for(i=0;i<5;i++){ for (j=0;j<3;j++){ //console.log(i+' '+j); if (j == 2) return; } } })()
использовать функцию для многоуровневых циклов-это хороший способ:
function find_dup () { for (;;) { for(;;) { if (done) 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();
есть по крайней мере пять различных способов, чтобы вырваться из двух или более циклов:
1) Установите Родительский(ы) цикл до конца
for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) { if (j === 2) { i = 5; break; } } }
2) Использовать метку
exit_loops: for (i = 0; i < 5; i++) { for (j = 0; j < 5; j++) { if (j === 2) break exit_loops; } }
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();
break
не принимает параметров. Есть два обходных пути:
завернуть их в функцию и вызов
return
установите флаг во внутреннем цикле и снова разорвать сразу после цикла, если флаг установлен.
вы можете разбить вложенные циклы со словом '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
The возврат; утверждение не работает в этом случае. рабочих Pen
другой трюк заключается в установке родительского цикла, чтобы достичь конца, а затем разорвать текущий цикл
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); } } }