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;

    });
}

1262voto

slezica Punkte 69362

Man kann sich nicht von einem forEach . Ich kann mir allerdings drei Möglichkeiten vorstellen, wie man es vortäuschen kann.

1. Der hässliche Weg : Übergeben Sie ein zweites Argument an forEach zu Verwendung als Kontext und speichern Sie dort einen Booleschen Wert, dann verwenden Sie eine if . Das sieht furchtbar aus.

2. Der umstrittene Weg : Umgeben Sie das Ganze mit einem try-catch blockieren und eine Ausnahme auslösen, wenn Sie abbrechen wollen. Das sieht ziemlich schlecht aus und kann die Leistung beeinträchtigen aber gekapselt werden kann.

3. Der lustige Weg : verwenden every() .

['a', 'b', 'c'].every(function(element, index) {
  // Do your thing, then:
  if (you_want_to_break) return false
  else return true
})

Sie können verwenden some() stattdessen, wenn Sie lieber return true zu brechen.

76voto

Domenic Punkte 104864

Ausbrechen aus Array#forEach ist nicht möglich. (Sie können den Quellcode, der dies in Firefox implementiert, auf der verlinkten Seite einsehen, um dies zu bestätigen).

Stattdessen sollten Sie eine normale for Schleife:

function recurs(comment) {
    for (var i = 0; i < comment.comments.length; ++i) {
        var subComment = comment.comments[i];
        recurs(subComment);
        if (...) {
            break;
        }
    }
}

(oder, wenn Sie es etwas cleverer angehen wollen und comment.comments[i] ist immer ein Objekt:)

function recurs(comment) {
    for (var i = 0, subComment; subComment = comment.comments[i]; ++i) {
        recurs(subComment);
        if (...) {
            break;
        }
    }
}

59voto

ForEach bricht bei der Rückkehr nicht ab, es gibt hässliche Lösungen, um dies zu erreichen, aber ich schlage vor, es nicht zu verwenden, sondern stattdessen zu versuchen, die Array.prototype.some o Array.prototype.every

var ar = [1,2,3,4,5];

ar.some(function(item,index){
  if(item == 3){
     return true;
  }
  console.log("item is :"+item+" index is : "+index);
});

42voto

igor Punkte 4913

In einigen Fällen Array.some wird wahrscheinlich die Anforderungen erfüllen.

31voto

None Punkte 1

Wie bereits von anderen erwähnt, können Sie eine Bestellung nicht stornieren. forEach Schleife, aber hier ist meine Lösung:

ary.forEach(function loop(){
    if(loop.stop){ return; }

    if(condition){ loop.stop = true; }
});

Natürlich wird die Schleife dadurch nicht wirklich unterbrochen, sondern es wird lediglich die Ausführung von Code auf allen Elementen nach dem "break" verhindert.

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