531 Stimmen

Wie kann man Javascript forEach stoppen?

Ich spiele mit Node.js und Mongoose - ich versuche, einen bestimmten Kommentar in einer tiefen Kommentarverschachtelung mit rekursiver Funktion zu finden und forEach innerhalb. Gibt es eine Möglichkeit, Node.js zu stoppen forEach ? So wie ich das verstehe, ist jeder forEach Iteration ist eine Funktion und ich kann nicht einfach break nur return aber das wird nicht aufhören forEach .

function recurs(comment) {
    comment.comments.forEach(function(elem) {

        recurs(elem);

        //if(...) break;

    });
}

-6voto

ApplePear Punkte 5

Sie können eine forEach-Schleife abbrechen, wenn Sie die Array-Methode überschreiben:

(function(){
    window.broken = false;

        Array.prototype.forEach = function(cb, thisArg) {
            var newCb = new Function("with({_break: function(){window.broken = true;}}){("+cb.replace(/break/g, "_break()")+"(arguments[0], arguments[1], arguments[2]));}");
            this.some(function(item, index, array){
                 newCb(item, index, array);
                 return window.broken;
            }, thisArg);
            window.broken = false;
        }

}())

Beispiel:

[1,2,3].forEach("function(x){\
    if (x == 2) break;\
    console.log(x)\
}")

Leider können Sie mit dieser Lösung keine normalen Unterbrechungen innerhalb Ihrer Rückrufe verwenden, Sie müssen ungültigen Code in Zeichenketten verpacken und native Funktionen funktionieren nicht direkt (aber Sie können das umgehen)

Viel Spaß beim Brechen!

-12voto

morterad Punkte 1

Warum nicht die einfache Rückgabe verwenden?

function recurs(comment){
comment.comments.forEach(function(elem){
    recurs(elem);
    if(...) return;
});

es wird von der Funktion 'recurs' zurückgegeben. Ich verwende es so. Obwohl dies nicht von forEach, sondern von der gesamten Funktion abbrechen wird, könnte es in diesem einfachen Beispiel funktionieren

-17voto

Joe Taylor Punkte 638

JQuery bietet eine each() Methode, nicht forEach() . Sie können ausbrechen aus each durch die Rückkehr false . forEach() ist Teil des ECMA-262-Standards, und die einzige mir bekannte Möglichkeit, aus diesem Standard auszubrechen, besteht darin, eine Ausnahme zu machen.

function recurs(comment) {
  try {
    comment.comments.forEach(function(elem) {
      recurs(elem);
      if (...) throw "done";
    });
  } catch (e) { if (e != "done") throw e; }
}

Hässlich, aber er erfüllt seinen Zweck.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X