[1,2,3].forEach(function(el) {
if(el === 1) break;
});
Wie kann ich dies mit der neuen forEach
Methode in JavaScript tun ? Ich habe versucht return;
, return false;
und break
. break
stürzt ab und return
macht nichts anderes als die Iteration fortzusetzen.
javascript
arrays
Scott Klarenbach
quelle
quelle
return
die Iteration zwar fortgesetzt wird, jedoch der nachfolgende Code im Block übersprungen wird. Nehmen Sie zum Beispiel diesen Code:[1,2,3].forEach(function(el) { if(el === 2) { console.log(`Match on 2!`); return; } console.log(el); });
.Derconsole.log(el);
wird übersprungen, wenn 2 übereinstimmt.Antworten:
Es gibt keine eingebaute Fähigkeit zu
break
inforEach
. Um die Ausführung zu unterbrechen, müssten Sie eine Ausnahme auslösen. z.B.JavaScript-Ausnahmen sind nicht besonders hübsch. Eine herkömmliche
for
Schleife ist möglicherweise besser geeignet, wenn Sie sie wirklich benötigenbreak
.Verwenden
Array#some
Verwenden Sie stattdessen
Array#some
:Dies funktioniert, weil
some
zurückgegeben wirdtrue
, sobald einer der in Array-Reihenfolge ausgeführten Rückrufe zurückkehrttrue
und die Ausführung des Restes kurzschließt.some
, es ist inversevery
(was bei a stopptreturn false
) undforEach
sind alle ECMAScript Fifth Edition-Methoden, die zu denArray.prototype
On-Browsern hinzugefügt werden müssen, in denen sie fehlen.quelle
some
undevery
dies sollte in der Antwort ganz oben stehen. Ich kann nicht verstehen, warum die Leute denken, dass es weniger lesbar ist. Es ist einfach großartig!Array#some
ist wirklich nett. Erstens ist es mit den meisten Browsern kompatibel, einschließlich IE9 und Firefox 1.5, und funktioniert auch sehr gut. Mein beispielhafter Anwendungsfall besteht darin, den Index in einem Array von Bereichen [a, b] zu finden, in denen eine Zahl zwischen einem unteren und einem oberen Grenzpaar liegt. Testen Sie und geben Sie true zurück, wenn es gefunden wird.for..of
wäre die nächstbeste Lösung allerdings nur für neuere Browser.In ECMAScript2015 (auch bekannt als ES6) gibt es jetzt eine noch bessere Möglichkeit, dies mit der neuen for of-Schleife zu tun . Beispielsweise druckt dieser Code die Array-Elemente nach der Nummer 5 nicht:
Aus den Dokumenten:
Benötigen Sie den Index in der Iteration? Sie können verwenden
Array.entries()
:quelle
entries
. for (const [index, element] von someArray.entries ()) {// ...}Object.entries(myObject)
es genau so verwenden und dann verwenden, wie Sie esfor..in
für das Array verwenden. Beachten Sie, dass JS-Arrays im Grunde genommen Objekte unter der Haube sind: blog.niftysnippets.org/2011/01/myth-of-arrays.htmlSie können jede Methode verwenden:
ES6
für die Unterstützung alter Browser:
Weitere Details hier .
quelle
[1,2,3].every( el => el !== 1 )
every
garantiert, dass Anrufe nacheinander getätigt werden?k
bei 0 beginnt und um 1 erhöht wird: http://www.ecma-international.org/ecma-262/6.0/#sec-array.prototype.everyZitat aus der MDN-Dokumentation von
Array.prototype.forEach()
:Verwenden Sie
Array.prototype.some()
stattdessen für Ihren Code (in der Frage), wie von @bobince vorgeschlagen . Es passt sehr gut zu Ihrem Anwendungsfall.quelle
Leider ist es in diesem Fall viel besser, wenn Sie nicht verwenden
forEach
. Verwenden Sie stattdessen eine regulärefor
Schleife, die jetzt genau so funktioniert, wie Sie es erwarten würden.quelle
Erwägen Sie die Verwendung
jquery
dereach
Methode von ', da sie die Rückgabe von false innerhalb der Rückruffunktion ermöglicht:Lodash-Bibliotheken bieten auch
takeWhile
Methoden, die mit map / redu / fold etc verkettet werden können:quelle
Aus Ihrem Codebeispiel
Array.prototype.find
geht hervor, wonach Sie suchen: Array.prototype.find () und Array.prototype.findIndex ()quelle
Wenn Sie den Vorschlag von Dean Edward verwenden und den StopIteration-Fehler auslösen möchten, um aus der Schleife auszubrechen, ohne den Fehler abfangen zu müssen, können Sie die folgende Funktion verwenden ( ursprünglich von hier ):
Mit dem obigen Code können Sie Code wie den folgenden ausführen, ohne Ihre eigenen Try-Catch-Klauseln ausführen zu müssen:
Beachten Sie, dass dadurch die Funktion Array.prototype.forEach nur aktualisiert wird, wenn sie bereits vorhanden ist. Wenn es noch nicht vorhanden ist, wird es nicht geändert.
quelle
Kurze Antwort: Verwenden Sie
for...break
diese Option oder ändern Sie Ihren Code, um ein Brechen zu vermeidenforEach
. Nicht verwenden.some()
oder.every()
emulierenfor...break
. Schreiben Sie Ihren Code neu, umfor...break
Schleifen zu vermeiden , oder verwenden Sie ihnfor...break
. Jedes Mal, wenn Sie diese Methoden alsfor...break
Alternative verwenden, tötet Gott Kätzchen.Lange Antwort:
.some()
und.every()
beide geben denboolean
Wert.some()
zurück,true
wenn ein Element zurückgegeben wird, für das die übergebene Funktion zurückgegeben wurdetrue
, und jedes,false
wenn ein Element zurückgegeben wird, für das die übergebene Funktion zurückgegeben wurdefalse
. Das ist es, was diese Funktionen bedeuten. Die Verwendung von Funktionen für das, was sie nicht bedeuten, ist viel schlimmer als die Verwendung von Tabellen für das Layout anstelle von CSS, da dies jeden frustriert, der Ihren Code liest.Die einzige Möglichkeit, diese Methoden als
for...break
Alternative zu verwenden, besteht darin, Nebenwirkungen zu verursachen (einige Variablen außerhalb der.some()
Rückruffunktion zu ändern ), und dies unterscheidet sich nicht wesentlich vonfor...break
.Die Verwendung von
.some()
oder.every()
alsfor...break
Loop-Alternative ist also nicht frei von Nebenwirkungen. Dies ist dann nicht viel saubererfor...break
. Dies ist frustrierend und daher nicht besser.Sie können Ihren Code jederzeit neu schreiben, sodass keine Notwendigkeit besteht
for...break
. Sie können das Array mit filtern.filter()
, das Array mit.slice()
usw. teilen und dann.forEach()
oder.map()
für diesen Teil des Arrays verwenden.quelle
for...break
Schleife, wenn du Leistung brauchst.for
Schleife ist die performante Iteration als Werkzeug.forEach()
,.any()
,.map()
,.filter()
usw.Dies ist nur etwas, das ich mir ausgedacht habe, um das Problem zu lösen ... Ich bin mir ziemlich sicher, dass es das Problem behebt, das der ursprüngliche Fragesteller hatte:
Und dann würden Sie es nennen, indem Sie verwenden:
Die Rückgabe von false innerhalb der Rückruffunktion führt zu einer Unterbrechung. Lassen Sie mich wissen, wenn das nicht funktioniert.
quelle
=== false
Möglicherweise ist es besser== false
, wenn Sie nicht explizit true (oder einen truey-Wert) zurückgeben müssen, um die Schleife fortzusetzen, damit ein Steuerpfad keinen Wert zurückgibt und die Schleife unerwartet unterbrochen wird.Ein anderes Konzept, das ich mir ausgedacht habe:
quelle
Array.prototype.forEach()
.for
undbreak
existierte lange bevor diese Frage gestellt wurde; Das OP suchte nach diesem Verhalten, indem es funktionaler warforEach
.for...in
und lösen könnenbreak
.Diese Lösung wurde auf einer anderen Site gefunden. Sie können forEach in ein Try / Catch-Szenario einschließen.
Weitere Details hier: http://dean.edwards.name/weblog/2006/07/enum/
quelle
quelle
Wenn Sie nach der Iteration nicht auf Ihr Array zugreifen müssen, können Sie aussteigen, indem Sie die Länge des Arrays auf 0 setzen. Wenn Sie es nach Ihrer Iteration noch benötigen, können Sie es mit Slice klonen.
Oder mit einem Klon:
Das ist eine weitaus bessere Lösung, als zufällige Fehler in Ihren Code zu werfen.
quelle
array.length
an0
sie in der aktuellen Iteration anwenden wird, ist es so wahrscheinlich manchmal besser zu Einsatzreturn
nach einer solchen ZuweisungDies ist eine for-Schleife, behält jedoch die Objektreferenz in der Schleife wie forEach () bei, aber Sie können ausbrechen.
quelle
Wie bereits erwähnt, können Sie nicht brechen
.forEach()
.Hier ist eine etwas modernere Methode, um mit ES6-Iteratoren einen Foreach durchzuführen. Ermöglicht den direkten Zugriff auf
index
/value
beim Iterieren.Ausgabe:
Links
Array.prototype.entries()
quelle
Noch ein Ansatz
quelle
Ich benutze nullhack für diesen Zweck, es versucht, auf die Eigenschaft von zuzugreifen
null
, was ein Fehler ist:quelle
throw BREAK
?Wenn du deine behalten willst
forEach
Syntax diese Weise effizient halten (obwohl sie nicht so gut ist wie eine reguläre for-Schleife). Suchen Sie sofort nach einer Variablen, die weiß, ob Sie aus der Schleife ausbrechen möchten.In diesem Beispiel wird eine anonyme Funktion zum Erstellen eines Funktionsbereichs verwendet, um den
forEach
Sie die erledigten Informationen speichern müssen .Meine zwei Cent.
quelle
Ich weiß es nicht richtig. Es ist nicht die Schleife zu brechen. Es ist ein Jugad
quelle
Verwenden Sie die
array.prototype.every
Funktion, mit der Sie die Schleife unterbrechen können. Siehe Beispiel hier Javascript-Dokumentation im Mozilla-Entwicklernetzwerkquelle
Stimmen Sie mit @bobince überein, gestimmt.
Auch zu Ihrer Information:
Prototype.js hat etwas für diesen Zweck:
$break
wird von Prototype.js intern abgefangen und verarbeitet, wodurch der "jeder" Zyklus unterbrochen wird, jedoch keine externen Fehler generiert werden.Weitere Informationen finden Sie unter Prototype.JS-API .
jQuery hat auch eine Möglichkeit, einfach false im Handler zurückzugeben, um die Schleife frühzeitig zu unterbrechen:
Weitere Informationen finden Sie unter jQuery-API .
quelle
Dies ist nicht die effizienteste, da Sie immer noch alle Elemente durchlaufen, aber ich dachte, es könnte sich lohnen, das sehr einfache zu betrachten:
quelle
continue
ist ein Schlüsselwort, Ihr Code ist ein Syntaxfehler.for of
Schleife wechseln undbreak;
von dieser wie gewohnt.Sie können dem folgenden Code folgen, der für mich funktioniert:
quelle
Ich benutze lieber
for in
for in
funktioniert ähnlichforEach
, und Sie können die Return-to-Exit-Funktion hinzufügen. Bessere Leistung auch.quelle
Wenn Sie wie in Ihrem Fall basierend auf dem Wert von Elementen, die sich bereits in Ihrem Array befinden, eine Unterbrechung vornehmen müssen (dh wenn die Unterbrechungsbedingung nicht von der Laufzeitvariablen abhängt, die sich ändern kann, nachdem dem Array seine Elementwerte zugewiesen wurden), können Sie auch eine Kombination verwenden von Slice () und IndexOf () wie folgt.
Wenn Sie brechen müssen, wenn forEach 'Apple' erreicht, können Sie verwenden
Wie in W3Schools.com angegeben, gibt die Slice () -Methode die ausgewählten Elemente in einem Array als neues Array-Objekt zurück. Das ursprüngliche Array wird nicht geändert.
Sehen Sie es in JSFiddle
Hoffe es hilft jemandem.
quelle
Sie können eine Variante erstellen von
forEach
dem ermöglichtbreak
,continue
,return
und sogarasync
/await
: (Beispiel in Typoskript geschrieben)Verwendungszweck:
quelle
versuchen Sie es mit "find":
quelle
Ja, es ist möglich, fortzufahren und eine forEach-Schleife zu verlassen.
Um fortzufahren, können Sie return verwenden. Die Schleife wird fortgesetzt, aber die aktuelle Funktion wird beendet.
Um die Schleife zu verlassen, können Sie den dritten Parameter auf die Länge 0 und das leere Array setzen. Die Schleife wird nicht fortgesetzt, die aktuelle Funktion jedoch, sodass Sie "return" zum Beenden verwenden können, wie z. B. das Beenden in einer normalen for-Schleife ...
Diese:
wird dies drucken:
quelle
Vorher ist mein Code unten
Ich habe nach unten gewechselt, es wurde behoben.
quelle