In Situationen, in denen Sie verschachtelte Datenstrukturen rekursiv durchlaufen und für jedes Element eine Operation ausführen müssen, können Sie a verwenden Kombination aus Rekursion und forEach. Es kann jedoch vorkommen, dass Sie die forEach-Schleife vorzeitig beenden müssen.
Im Gegensatz zu einer regulären Schleife mit break- oder continue-Anweisungen fehlt forEach ein integrierter Mechanismus zum Anhalten der Iteration. Um dieses Verhalten zu simulieren, untersuchen wir drei Ansätze:
1. Der „hässliche“ Weg: Einen kontextuellen Booleschen Wert verwenden
Übergeben Sie ein zweites Argument als Kontext an forEach und speichern Sie darin einen booleschen Wert. Überprüfen Sie innerhalb der Rückruffunktion den booleschen Wert und brechen Sie ihn bei Bedarf aus. Dieser Ansatz ist optisch unattraktiv.
function recurs(comment) {
var stop = false;
comment.comments.forEach(function (elem) {
recurs(elem);
if (...) stop = true;
}, stop);
}
2. Der „umstrittene“ Weg: Ausnahmebehandlung
Schließen Sie die forEach-Schleife in einen Try-Catch-Block ein. Wenn Sie eine Unterbrechung durchführen möchten, lösen Sie eine Ausnahme aus und fangen sie außerhalb der Schleife ab. Dieser Ansatz kann sich auf die Leistung auswirken und Bedenken hinsichtlich der Lesbarkeit des Codes hervorrufen.
try {
comment.comments.forEach(function (elem) {
recurs(elem);
if (...) throw new Error("Stop Iteration");
});
} catch (e) {
if (e.message === "Stop Iteration") return;
}
3. Die „lustige“ Art: Die Verwendung von every()
every() ist eine bessere Option. Die Iteration durch die Sammlung wird fortgesetzt, bis die Rückruffunktion „false“ zurückgibt. Dies fungiert effektiv als Break-Anweisung.
comment.comments.every(function (elem) {
recurs(elem);
if (...) return false;
return true;
});
Sie können auch some() anstelle von every() verwenden, wenn Sie lieber true zurückgeben möchten, um zu brechen.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3