2013-06-12 25 views
15

Jakie polecenia należy użyć, aby wydostać się z pętli for również z //code inside skoku bezpośredniego do //code afterPrzerwa na pętli od wewnątrz przypadku przełącznika w JavaScript

//code before 
for(var a in b) 
    { 
    switch(something) 
     { 
     case something: 
      { 
      //code inside 
      break; 
      } 
     } 
    } 
//code after 
+0

Dodaj 'break;' zaraz po zamknięciu '}' instrukcji switch. – War10ck

+3

możesz rozważyć refaktoryzację swojego rozwiązania. – Mahdi

+0

@Jaak Kütt Nigdy nie dotykaj mojego stylu wcięcia. – BASILIO

Odpowiedz

9

Niestety JavaScript nie ma pozwolić break ing przez wielu poziomach. Najprostszym sposobem, aby to zrobić, aby wykorzystać moc rachunku return tworząc anonimową funkcję:

//code before 
(function() { 
    for (var a in b) { 
     switch (something) { 
     case something: 
      { 
       //code inside 
       return; 
      } 
     } 
    } 
}()); 
//code after 

To działa, ponieważ return pozostawia funkcję, a zatem pośrednio opuszcza pętlę, przenosząc Cię prosto do code after

+0

Czuję, że anonimowa funkcja jest przesadą dla tego rodzaju rzeczy. Ponadto, w zależności od tego, jak skomplikowane może być przełączenie/switch, mogę przejrzeć kod i zobaczyć "return", a nie kojarzyć go z anonimową funkcją (co sprawia, że ​​konserwacja jest nieco bardziej skomplikowana później). Przyznaję, że nie jest to skomplikowany fragment kodu, ale zastosowanie tego w praktyce może stać się brzydkie szybko. –

+0

@BradChristie Nie jestem pewien, czy anonimowe funkcje są tak wielkimi sprawami, jak nadmiar!Jeśli chodzi o czytelność, to na pewno właśnie takie są komentarze ... Refaktoryzacja byłaby prawdopodobnie idealna, ale jest to najczystszy sposób na wyjście z pętli. – lonesomeday

+0

Nie dramatyczne, ale nadal widzę różnicę (http://jsperf.com/exiting-nested-switch-within-for-in). –

16

użyć innej zmiennej flagi, gdy trzeba wyjście:

var keepGoing = true; 
for (var a in b){ 
    switch (something){ 
    case something: 
     keepGoing = false; 
     break; 
    } 
    if (!keepGoing) break; 
} 

example

+2

@downvoter: co daje? Idealnie akceptowalny (i chociaż 'break' pozwala na użycie parametru' label', osobiście uważam, że wytwórnie wychodziły z BASIC i po prostu prowadzą do [spaghetti code] (http://en.wikipedia.org/wiki/Spaghetti_code) ...) –

7

to zależy od tego co chcesz osiągnąć ... jedna rzecz powszechnie zrobić coś takiego:

//code before 
for(var a in b) 
{ 
    var breakFor = false; 
    switch(something) 
    { 
     case something: 
     { 
      //code inside 
      breakFor = true; 
      break; 
     } 
    } 
    if (breakFor) 
     break; 
} 
//code after 
+0

Jeff był pierwszym, który użył bool var, aby to osiągnąć, a inny użytkownik bierze więcej upvotes przy użyciu tego samego zdania. Czemu? – Eduardo

11

Można użyć label. Mieć podpisane oświadczenie i włamać się do tej etykiety. outerLoop to etykieta, której użyłem tutaj.

//code before 
outerLoop: 
for (var a in b) { 
    switch (something) { 
     case 'case1': 
      //code inside 
      break outerLoop; 
    } 
} 
//code after 
+0

Można używać 'etykiety' tylko raz, ale może się to skończyć za pomocą kodu spaghetti, jeśli używasz go częściej. W takich sytuacjach najpierw zaleciłbym zamianę rozwiązania. – Mahdi

0

Zawsze uważam, że używanie instrukcji warunkowych jest jednym z najprostszych sposobów kontrolowania przepływu kodu, przynajmniej koncepcyjnie.

var done = false; 
//code before for loop 
for(var a in b){ 
    switch(switchParameter){ 
     case firstCase: 
      //code inside 
      done = true; 
      break; 
     } 
    } 
    if(done) 
     break; 
} 
//code outside of for loop 
1

Można określić, która pętla/przełącznik ulegnie przerwaniu.

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

Zobacz this answer.

0
for(var i=0; i<b.length; i++) { 
    switch (something) { 
     case 'something1': 
      i=b.length; 
    } 
} 

Gdy zmienna iteracyjna i osiągnie koniec pętli, zrywa się. Ale można zmusić zmienną iteracyjną, aby osiągnęła koniec pętli.

+0

Lepiej podać pewne wyjaśnienie tego kodu, zwłaszcza, że ​​istnieje sześć innych odpowiedzi. – EJoshuaS

+0

To nie rozwiąże problemu, ponieważ kod będzie działał jeszcze 1 raz, gdy 'i = b.length'. Co więcej, bardzo niebezpieczne jest ustawienie 'i' niższej niż' b.length', która będzie działać wiecznie !!!. Dlatego zalecam, abyśmy zamiast tego używali funkcji, etykiety lub flagi. –