2009-10-14 2 views
153

Я попытался это:Как разбить вложенные циклы в JavaScript?

for(i = 0; i < 5; i++){ 
    for(j = i + 1; j < 5; j++){ 
     break(2); 
    } 
    alert(1); 
} 

только получить:

SyntaxError : missing ; before statement

Итак, как бы я нарушу вложенный цикл в JavaScript?

+2

перерыв (2); : o что вы подразумеваете под * 2 *, break не может иметь никаких аргументов –

+3

В строке 7 отсутствует точка с запятой после 'alert (1)'. –

+22

@Nathan Taylor: точки с запятой являются необязательными в JavaScript, но считается хорошим стилем –

ответ

440

Вы должны быть в состоянии разорвать на этикетке, например, так:

function foo() 
{ 
    dance: 
    for(var k = 0; k < 4; k++){ 
     for(var m = 0; m < 4; m++){ 
      if(m == 2){ 
       break dance; 
      } 
     } 
    } 
} 
+0

Это Java, а не JavaScript. –

+12

@Aaron, JavaScript также имеет метки. –

+3

Собственно, это тоже JavaScript. – Fenton

0

break не принимает параметры. Есть два способа решения:

  1. завернуть их в функции и называют return

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

+19

Фактически, он принимает параметры , :) https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Statements/break – deceze

+0

Это работает в IE? –

+3

Aaron: Я только что протестировал в IE6; он делает :) –

10

К сожалению, вам придется установить флаг или использовать метки (думаю, заявления старой школы 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) 
}; 

изменить: метка неправильно помещена.

также смотрите:

+1

Значит, этикетка не может идти вниз по течению от перерыва? Например, давайте скажем, что все условия выполнены, мне вообще не нужны петли. Можно ли создать ветвь на этикетке, объявленной после циклов? – eaglei22

-2

Перерыв 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; 
}; 
29

Вам нужно называть свой внешний цикл и прерывать этот цикл, а не ваш внутренний цикл - вот так.

outer_loop: 
for(i=0;i<5;i++) { 
    for(j=i+1;j<5;j++) { 
     break outer_loop; 
    } 
    alert(1); 
} 
+2

Вау, я не знал, что мы можем назвать петли, отличная информация! +1 –

+11

@ o.k.w: вы не называете цикл. Вы просто отмечаете позицию в источнике. – xtofl

+6

Никогда не знал, что поддерживаемые JavaScript метки. Интересно, почему я этого раньше не видел. : O –

20

См. Aaron's. В противном случае: j=5;i=5 вместо break.

+0

N i c e one! –

+1

Это действительно решение. очень блестящий !!! – Nathanphan

+0

Это просто лучшее и самое чистое решение. Не возвращайтесь к использованию этикеток, они выглядят ужасно. –

12
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 
      } 
     } 
    } 

код копируется из Best way to break from nested loops in Javascript?

Пожалуйста, поиск, прежде чем отправлять вопрос. Ссылка была ПЕРВЫЙ связанный вопрос, который я видел в левой части этой страницы!

-8
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; 
} 
+2

В Javascript «goto» может быть зарезервированным словом, но на самом деле он ничего не делает ... – NickFitz

+0

Downvoted, по той же причине, что и NickFitz. –

+0

@NickFitz, nope, 'goto' не является зарезервированным словом в JavaScript:' ReferenceError: goto не определен' –

2

Используйте функцию для многоуровневого петель - это хороший способ:

function find_dup() { 
    for (;;) { 
     for(;;) { 
      if (done) return; 
     } 
    } 
} 
+0

Wooo, что это за 'for (;;)'? Никогда не видел этого раньше. –

+2

Infinity loop :) это как while (true) {} – Anatoliy

4

На мой взгляд, очень важно, чтобы сохранить ваш конструкт словарный запас к минимуму.Если я смогу покончить с перерывами и продолжаю легко, я делаю это.

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% серьезно относится к «грязным», но я до сих пор считаю, что «разрыв» нарушающее собственную концепцию чистого кода. Мысль о том, чтобы иметь многоуровневые перерывы, заставляет меня чувствовать, что принимаю душ.

Я нахожу оправдание, что я имею в виду, о смысле о коде, потому что я закодировал всю жизнь. Лучшее, что я могу придумать, это сочетание манер и грамматики. Перерывы просто не вежливы. Многоуровневые перерывы просто грубые.

При взгляде на заявление, читатель точно знает, где искать. Все, что вам нужно знать о правилах участия, заключено в контракте между скобками. Как читатель, оскорбляет меня, кажется, что меня обманули.

Ясность гораздо более уважительна, чем обман.

+0

Зачем вам нужно, чтобы ваш конструкторский словарь был как минимум? Аргумент, который ломается, «грязный», абсурден. С точки зрения удобочитаемости ваше решение намного хуже, и оно не улучшается. У вас есть точка, хотя, как и любая конструкция, перерывы могут подвергаться насилию, но немного обман здесь или там для удобства чтения определенно в порядке. –

+0

слишком долго, чтобы вписаться в комментарий к тому, что я сделал редактирование. –

+0

Кроме того, сохранение словарного запаса конструкции до минимума связано скорее с переходом между многими языками. Вы, как правило, используете больше языка, который является общим между ними. В случае JavaScript это дает возможность сделать код совместимым в разных системах, а также помогает читателям, которые не могут использовать JavaScript в качестве основного языка. –

4

Wrap в функции, выполняющейся себя и вернуть

(function(){ 
    for(i=0;i<5;i++){ 
     for (j=0;j<3;j++){ 
      //console.log(i+' '+j); 
      if (j == 2) return; 
     } 
    } 
})() 
1

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(); 
+0

. Это выходит из всей функции, а не просто прерывает цикл. – Xufox

0

Вы можете разбить вложенными для петель со словом «разрыв», она работает без каких-либо ярлыков.

В вашем случае вам необходимо иметь условие, достаточное для разрыва цикла.

Вот пример:

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 возвращения; В этом случае инструкция не работает. Working pen

0

Другое фокус в том, установив родительский цикл, чтобы дойти до конца, а затем перерыв токовой петли

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); 
     } 
    } 
} 
Смежные вопросы