Was ist der beste Weg, um verschachtelte Schleifen in Javascript zu lösen?
//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
quelle
quelle
Antworten:
Genau wie Perl,
wie in Abschnitt 12.12 von EMCA-262 definiert. [MDN-Dokumente]
Im Gegensatz zu C können diese Bezeichnungen nur für
continue
und verwendet werdenbreak
, da Javascript dies nicht hatgoto
.quelle
continue
und verfügbar istbreak
.Wickeln Sie das in eine Funktion ein und dann einfach
return
.quelle
Ich bin etwas spät zur Party, aber das Folgende ist ein sprachunabhängiger Ansatz, bei dem GOTO / Labels oder Funktionsumbruch nicht verwendet werden:
Auf der Oberseite fließt es natürlich, was der Nicht-GOTO-Menge gefallen sollte. Auf der anderen Seite muss die innere Schleife die aktuelle Iteration vor dem Beenden abschließen, damit sie in einigen Szenarien möglicherweise nicht anwendbar ist.
quelle
break
odercontinue
unmittelbar nach dem Setzen von z und y einfügen? Ich mag die Idee, diefor
Bedingungen der Schleife zum Ausstoßen zu nutzen. Auf seine Weise elegant.Mir ist klar, dass dies ein wirklich altes Thema ist, aber da mein Standardansatz noch nicht hier ist, dachte ich, ich poste ihn für die zukünftigen Googler.
quelle
condition
ausgewertet wird, werdentrue
die restlichen 10 Iterationen immer noch durchlaufen und derabort
Wert jedes Mal überprüft . Dies ist kein Leistungsproblem für 10 Iterationen, aber es wäre beispielsweise bei 10.000.abort
und des Ausdrucks. In einfachen Szenarien mag das in Ordnung sein, aber für große Schleifen mit millionenfachen Iterationen könnte das ein Problem seinWie ist das? :) :)
quelle
x
ist der Wert für x unabhängig davon, ob eine Logik innerhalb der Schleife zu einem späteren Zeitpunkt auf x verweist (z. B. definiert sie eine innere anonyme Funktion, die später gespeichert und ausgeführt wird) war am Ende der Schleife, nicht der Index, während dessen die Funktion definiert wurde. (Fortsetzung)x
einen Parameter an Ihre anonyme Funktion übergeben, damit eine neue Kopie davon erstellt wird, die dann als Abschluss referenziert werden kann , da sie sich ab diesem Zeitpunkt nicht mehr ändert. Kurz gesagt, ich empfehle die Antwort von Ephemient.Ziemlich einfach:
quelle
loop1=loop2=false;
Hier sind fünf Möglichkeiten, um aus verschachtelten Schleifen in JavaScript auszubrechen:
1) Setzen Sie die übergeordnete (n) Schleife (n) auf das Ende
2) Etikett verwenden
3) Variable verwenden
4) Verwenden Sie die selbstausführende Funktion
5) Verwenden Sie die reguläre Funktion
quelle
break 2;
wie wir sie in PHP haben. Keine Loop-Labels, keine Funktionen, keine If-else-Checks, kein Temperieren mit / Sprengen von Loop-Variablen - nur saubere Syntax!Wie wäre es, wenn Sie überhaupt keine Unterbrechungen, keine Abbruchflags und keine zusätzlichen Bedingungsprüfungen verwenden? Diese Version sprengt nur die Schleifenvariablen (macht sie
Number.MAX_VALUE
), wenn die Bedingung erfüllt ist, und zwingt alle Schleifen, elegant zu enden.Es gab eine ähnliche Antwort für verschachtelte Schleifen vom Dekrementiertyp, dies funktioniert jedoch für inkrementelle verschachtelte Schleifen, ohne den Abschlusswert jeder Schleife für einfache Schleifen berücksichtigen zu müssen.
Ein anderes Beispiel:
quelle
Wie wäre es, Schleifen an ihre Endgrenzen zu bringen?
quelle
Wenn Sie Coffeescript verwenden, gibt es ein praktisches Schlüsselwort "do", mit dem Sie eine anonyme Funktion einfacher definieren und sofort ausführen können:
... also können Sie einfach "return" verwenden, um aus den Schleifen herauszukommen.
quelle
for
Schleifen, nicht zwei.Ich dachte, ich würde einen funktionalen Programmieransatz zeigen. Sie können wie in meinen Lösungen aus verschachtelten Funktionen von Array.prototype.some () und / oder Array.prototype.every () ausbrechen. Ein zusätzlicher Vorteil dieses Ansatzes besteht darin, dass
Object.keys()
nur die eigenen aufzählbaren Eigenschaften eines Objekts aufgelistet werden, während "eine For-In-Schleife auch Eigenschaften in der Prototypkette auflistet" .Nah an der Lösung des OP:
Lösung, die das Durchlaufen der Überschriften / Elemente reduziert:
quelle
Bereits zuvor von Swilliams erwähnt , aber mit einem Beispiel unten (Javascript):
quelle
Hmmm hallo zur 10 Jahre alten Party?
Warum nicht eine Bedingung in Ihr für setzen?
So hörst du auf, wenn du willst
In meinem Fall können wir mit Typescript einige () verwenden, die das Array durchlaufen und anhalten, wenn die Bedingung erfüllt ist. Mein Code sieht also folgendermaßen aus:
Auf diese Weise wurde die Schleife direkt nach Erfüllung der Bedingung gestoppt
Erinnerung: Dieser Code wird in TypeScript ausgeführt
quelle
quelle
Der beste Weg ist -
1) Sortieren Sie die beiden Arrays, die in der ersten und zweiten Schleife verwendet werden.
2) Wenn das Element übereinstimmt, unterbrechen Sie die innere Schleife und halten Sie den Indexwert.
3) Wenn Sie die nächste Iteration starten, starten Sie die innere Schleife mit dem Hold-Index-Wert.
quelle