Как разбить вложенные циклы в JavaScript?
-
21-09-2019 - |
Вопрос
Я попробовал это:
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;
}
}
}
}
Другие советы
Вам нужно назвать свой внешний цикл и разорвать этот цикл, а не ваш внутренний цикл - вот так.
outer_loop:
for(i=0;i<5;i++) {
for(j=i+1;j<5;j++) {
break outer_loop;
}
alert(1);
}
Посмотри у Аарона.В противном случае:j=5;i=5
вместо того , чтобы break
.
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?
Пожалуйста, выполните поиск перед отправкой вопроса.Ссылка была ПЕРВЫМ связанным вопросом, который я увидел в левой части этой страницы!
Существует по крайней мере пять различных способов вырваться из двух или более циклов:
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();
К сожалению, вам придется установить флаг или использовать метки (вспомните старомодные инструкции 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% серьезен насчет "грязности", но я все еще думаю, что "break" противоречит моей собственной концепции чистого кода.Мысль о многоуровневых перерывах на самом деле вызывает у меня желание принять душ.
Я нахожу оправдание тому, что я имею в виду, говоря о чувстве, связанном с кодом, потому что я кодировал всю жизнь.Лучшее, почему я могу об этом подумать, - это сочетание хороших манер и грамматики.Перерывы просто невежливы.Многоуровневые перерывы - это просто грубо.
Просматривая инструкцию 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();
break
не принимает параметров.Есть два обходных пути:
Оберните их в функцию и вызовите
return
Установите флаг во внутреннем цикле и снова прервитесь сразу после цикла, если флаг установлен.
Вы можете разбить вложенные циклы 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
В Возврат; оператор в этом случае не работает.Рабочая ручка
Другой трюк заключается в настройке родительского цикла на достижение конца, а затем прерывании текущего цикла
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);
}
}
}
Разорвать 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;
};
function myFunction(){
for(var i = 0;i < n;i++){
for(var m = 0;m < n;m++){
if(/*break condition*/){
goto out;
}
}
}
out:
//your out of the loop;
}