Вопрос

Я попробовал это:

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 не принимает параметров.Есть два обходных пути:

  1. Оберните их в функцию и вызовите return

  2. Установите флаг во внутреннем цикле и снова прервитесь сразу после цикла, если флаг установлен.

Вы можете разбить вложенные циклы 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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top