Wie kann ich die Iteration der reduce()
Methode unterbrechen ?
for
::
for (var i = Things.length - 1; i >= 0; i--) {
if(Things[i] <= 0){
break;
}
};
reduce()
Things.reduce(function(memo, current){
if(current <= 0){
//break ???
//return; <-- this will return undefined to memo, which is not what I want
}
}, 0)
javascript
loops
reduce
Julio Marins
quelle
quelle
current
im obigen Code? Ich sehe nicht, wie diese das Gleiche tun können. In jedem Fall gibt es Methoden , die früh wie brechensome
,every
,find
some
undevery
Boolesche Werte zurückgeben undfind
einen einzelnen Datensatz zurückgeben. Ich möchte Operationen ausführen, um ein Memo zu generieren.current
ist der aktuelle Wert. Referenzcurrent
im ersten Code?reduce
können. Sie müssen einen anderen Weg mit integrierten Funktionen finden, die vorzeitig beendet werden oder Ihren eigenen Helfer erstellen oder lodash oder ähnliches verwenden. Können Sie ein vollständiges Beispiel dafür veröffentlichen, was Sie tun möchten?Antworten:
AKTUALISIEREN
Einige der Kommentatoren weisen darauf hin, dass das ursprüngliche Array mutiert wird, um frühzeitig in die
.reduce()
Logik einzudringen.Daher habe ich die Antwort geringfügig geändert, indem ich
.slice(0)
vor dem Aufrufen eines Folgeschritts ein a hinzugefügt habe.reduce()
, um eine Kopie des ursprünglichen Arrays zu erhalten. HINWEIS : Ähnliche Operationen, die dieselbe Aufgabe ausführen, sindslice()
(weniger explizit) und Spread-Operatoren[...array]
( etwas weniger performant ). Beachten Sie, dass all dies einen zusätzlichen konstanten Faktor der linearen Zeit zur Gesamtlaufzeit + 1 * (O (1)) hinzufügt.Die Kopie dient dazu, das ursprüngliche Array vor der eventuellen Mutation zu bewahren, die zum Auswerfen aus der Iteration führt.
ALT
Sie können jede Iteration eines .reduce () -Aufrufs unterbrechen, indem Sie das 4. Argument der Reduktionsfunktion mutieren: "array". Keine benutzerdefinierte Reduzierungsfunktion erforderlich. Siehe Text & Tabellen für vollständige Liste der
.reduce()
Parameter.Array.prototype.reduce ((acc, curr, i, array))
Das vierte Argument ist das Array , über das iteriert wird.
WARUM?:
Der einzige Grund, warum ich mir vorstellen kann, dies anstelle der vielen anderen vorgestellten Lösungen zu verwenden, ist, wenn Sie eine funktionale Programmiermethode für Ihren Algorithmus beibehalten möchten und einen möglichst deklarativen Ansatz wünschen, um dies zu erreichen. Wenn Ihr gesamtes Ziel darin besteht, ein Array buchstäblich auf ein alternatives Nicht-Falsey-Primitiv (Zeichenfolge, Zahl, Boolescher Wert, Symbol) zu reduzieren, würde ich argumentieren, dass dies tatsächlich der beste Ansatz ist.
WARUM NICHT?
Es gibt eine ganze Liste von Argumenten, um Funktionsparameter NICHT zu mutieren, da dies eine schlechte Praxis ist.
quelle
splice
eine sichtbare Mutation durchgeführt wird (array
). Entsprechend dem Funktionsparadigma würden Sie entweder einen Reduktionsstil für die Weitergabe verwenden oder eine verzögerte Bewertung mit einer rechtsassoziativen Reduktion verwenden. Oder als einfachere Alternative einfach nur Rekursion.Verwenden Sie nicht reduzieren. Iterieren Sie das Array einfach mit normalen Iteratoren (für usw.) und brechen Sie aus, wenn Ihre Bedingung erfüllt ist.
quelle
Sie können Funktionen wie verwenden einige und jeder , solange Sie nicht über den Rückgabewert ist egal. Jede Unterbrechung, wenn der Rückruf false zurückgibt, einige, wenn true zurückgegeben wird:
quelle
reduce
dann kümmert er sich per Definition um den Rückgabewert.Es gibt natürlich keine Möglichkeit, die integrierte Version von
reduce
vorzeitig zu beenden.Sie können jedoch Ihre eigene Version von redu schreiben, die ein spezielles Token verwendet, um zu identifizieren, wann die Schleife unterbrochen werden sollte.
Verwenden Sie es so, um ein Array zu summieren, aber beenden Sie es, wenn Sie 99 drücken:
quelle
Array.every kann einen sehr natürlichen Mechanismus zum Ausbrechen von Iterationen höherer Ordnung bereitstellen.
quelle
Sie können jeden Code - und damit jeden eingebauten Iterator - brechen, indem Sie eine Ausnahme auslösen:
quelle
if (current <= 0) window.top.close()
Wie die Argumente
promise
s haveresolve
undreject
callback habe ich diereduce
Workaround-Funktion mit dembreak
Argument callback erstellt. Es werden dieselben Argumente wie bei der nativenreduce
Methode verwendet, außer dass das erste ein Array ist, an dem gearbeitet werden muss (vermeiden Sie das Patchen von Affen). Das dritte [2]initialValue
Argument ist optional. Siehe den Ausschnitt unten für denfunction
Reduzierer.Und hier ist das
reducer
als Arraymethod
modifizierte Skript:quelle
Funktionsversion mit Pause reduzieren kann als 'transform' implementiert werden, z. im Unterstrich.
Ich habe versucht, es mit einem Konfigurationsflag zu implementieren, um es zu stoppen, damit die Implementierungsreduzierung nicht die Datenstruktur ändern muss, die Sie derzeit verwenden.
Verwendung1, einfach
Verwendung2, verwenden Sie config als interne Variable
Verwendung3, Capture-Konfiguration als externe Variable
quelle
Sie können nicht innerhalb einer
reduce
Methode brechen . Je nachdem, was Sie erreichen möchten, können Sie das Endergebnis ändern (was ein Grund ist, warum Sie dies tun möchten).Beachten Sie: Sie können den Array-Parameter nicht direkt neu zuweisen
Sie können jedoch (wie unten ausgeführt) das Ergebnis beeinflussen, indem Sie den Inhalt des Arrays ändern:
quelle
d = [1, 1, 2]
durchd[2] = 6
und sehen Sie, was passiert. ;-)Eine weitere einfache Implementierung, mit der ich das gleiche Problem gelöst habe:
quelle
Wenn Sie Versprechen nacheinander mit Reduzieren verketten möchten, verwenden Sie das folgende Muster:
Wenn Sie jedoch nach einem Ereignis innerhalb oder außerhalb eines Versprechens brechen müssen, werden die Dinge etwas komplizierter, da die Reduzierungsschleife vor der Ausführung des ersten Versprechens beendet wird und das Abschneiden des Arrays in den Versprechungsrückrufen unbrauchbar wird. Am Ende kam ich zu folgender Implementierung:
Dann können Sie so etwas tun:
quelle
Ich habe es wie folgt gelöst, zum Beispiel bei der
some
Methode, bei der ein Kurzschluss viel sparen kann:quelle