Jaki jest najlepszy sposób na oderwanie się od zagnieżdżonych pętli w JavaScript?
//Write the links to the page.
for (var x = 0; x < Args.length; x++)
{
for (var Heading in Navigation.Headings)
{
for (var Item in Navigation.Headings[Heading])
{
if (Args[x] == Navigation.Headings[Heading][Item].Name)
{
document.write("<a href=\""
+ Navigation.Headings[Heading][Item].URL + "\">"
+ Navigation.Headings[Heading][Item].Name + "</a> : ");
break; // <---HERE, I need to break out of two loops.
}
}
}
}
javascript
loops
nested-loops
break
Gary Willoughby
źródło
źródło
Odpowiedzi:
Podobnie jak Perl,
zgodnie z definicją w EMCA-262 sekcja 12.12. [Dokumenty MDN]
W przeciwieństwie do C, te etykiety mogą być używane tylko dla
continue
ibreak
, ponieważ JavaScript nie magoto
.źródło
continue
ibreak
.Zawiń to w funkcję, a potem po prostu
return
.źródło
Jestem trochę spóźniony na imprezę, ale poniższe podejście jest niezależne od języka, które nie używa GOTO / etykiet ani pakowania funkcji:
Z drugiej strony płynie naturalnie, co powinno zadowolić tłum nie-GOTO. Z drugiej strony, wewnętrzna pętla musi zakończyć bieżącą iterację przed zakończeniem, więc może nie mieć zastosowania w niektórych scenariuszach.
źródło
break
lubcontinue
zaraz po ustawieniu Z i Y? Podoba mi się pomysł użycia warunkówfor
pętli do wyrzucenia. Elegancki na swój sposób.Zdaję sobie sprawę, że to naprawdę stary temat, ale ponieważ moje standardowe podejście jeszcze nie jest dostępne, pomyślałem, że opublikuję go dla przyszłych pracowników Google.
źródło
condition
wartość zostanie obliczonatrue
przy pierwszej iteracji zagnieżdżonej pętli, nadal przeprowadzane jest przez pozostałe 10 iteracji, sprawdzającabort
wartość za każdym razem. Nie jest to problem z wydajnością dla 10 iteracji, ale byłoby powiedzmy z 10 000.abort
i wyrażeń. W prostych scenariuszach, które mogą być w porządku, ale dla dużych pętli z iteracjami gazillionów może to stanowić problemJak to? :)
źródło
x
, jeśli jakakolwiek logika w pętli odwołuje się do x w późniejszym czasie (na przykład definiuje wewnętrzną anonimową funkcję, która jest zapisywana i wykonywana później), wartość x będzie dowolna znajdował się na końcu pętli, a nie indeks, w którym funkcja została zdefiniowana. (kont.)x
parametr do swojej anonimowej funkcji, aby utworzyła nową jej kopię, którą można następnie nazwać zamknięciem, ponieważ od tego momentu nie zmieni się. Krótko mówiąc, polecam odpowiedź ephemient.Całkiem proste:
źródło
loop1=loop2=false;
Oto pięć sposobów na wyrwanie się z zagnieżdżonych pętli w JavaScript:
1) Ustaw pętlę rodzica (rodziców) na końcu
2) Użyj etykiety
3) Użyj zmiennej
4) Użyj funkcji samodzielnego wykonywania
5) Użyj zwykłej funkcji
źródło
break 2;
jak w PHP. Bez etykiet pętli, bez funkcji, bez sprawdzania „if-else”, bez temperowania za pomocą / wybuchu zmiennych pętli - po prostu czysta składnia!Co powiesz na to, by nie używać żadnych przerw, żadnych flag przerwania i żadnych dodatkowych kontroli warunków. Ta wersja po prostu wysadza zmienne w pętli (czyni je
Number.MAX_VALUE
), gdy warunek jest spełniony, i zmusza wszystkie pętle do eleganckiego zakończenia.Była podobna odpowiedź na zagnieżdżone pętle typu zmniejszającego, ale działa to na zagnieżdżone pętle typu bez konieczności rozważania wartości końcowej każdej pętli dla prostych pętli.
Inny przykład:
źródło
Co powiesz na przesunięcie pętli do ich granic końcowych
źródło
Jeśli używasz Coffeescript, istnieje wygodne słowo kluczowe „do”, które ułatwia zdefiniowanie i natychmiastowe wykonanie anonimowej funkcji:
... dzięki czemu możesz po prostu użyć „return”, aby wyjść z pętli.
źródło
for
pętle, a nie dwie.Myślałem, że pokażę podejście programowania funkcjonalnego. Możesz wyrwać się z zagnieżdżonych funkcji Array.prototype.some () i / lub Array.prototype.every (), jak w moich rozwiązaniach. Dodatkową zaletą tego podejścia jest to, że
Object.keys()
wylicza tylko własne wyliczalne właściwości obiektu, podczas gdy „pętla for-in wylicza również właściwości w łańcuchu prototypów” .Blisko rozwiązania OP:
Rozwiązanie, które zmniejsza iterację nagłówków / pozycji:
źródło
Wspomniane już wcześniej przez swilliams , ale z poniższym przykładem (Javascript):
źródło
Hmmm cześć na 10-letniej imprezie?
Dlaczego nie postawić jakiegoś warunku?
W ten sposób zatrzymujesz się, kiedy chcesz
W moim przypadku, używając Typescript, możemy użyć niektórych (), które przechodzą przez tablicę i zatrzymują się, gdy warunek jest spełniony, więc mój kod wygląda następująco:
W ten sposób pętla zatrzymała się zaraz po spełnieniu warunku
Przypomnienie: ten kod działa w TypeScript
źródło
źródło
najlepszym sposobem jest -
1) Posortuj obie tablice, które są używane w pierwszej i drugiej pętli.
2) jeśli element pasuje, przerwij wewnętrzną pętlę i przytrzymaj wartość indeksu.
3) przy rozpoczęciu następnej iteracji rozpocznij wewnętrzną pętlę z wartością indeksu wstrzymania.
źródło