Wie springe ich zur nächsten Iteration in jQuery.each () util?

434

Ich versuche, durch eine Reihe von Elementen zu iterieren. In der Dokumentation von jQuery heißt es:

jquery.Each () Dokumentation

Die Rückgabe von non-false entspricht einer continue-Anweisung in einer for-Schleife. Sie springt sofort zur nächsten Iteration.

Ich habe versucht, "return non-false" zu nennen. und 'nicht falsch;' (ohne Rückgabe) Keiner von beiden springt zur nächsten Iteration. Stattdessen brechen sie die Schleife. Was vermisse ich?

Josh
quelle
9
In ihrer unendlichen Weisheit haben die Bods bei jQuery diese Notiz jetzt aus der Dokumentation entfernt - oder zumindest nicht auf jeder Seite () . Ich bin sehr froh zu sehen, dass diese Frage immer noch hier auf SO und im weiteren Sinne auf Google zu finden ist, da dies eines der einfachen Dinge ist, die ich immer vergesse :)
Doug McLean

Antworten:

783

Was sie mit nicht falsch meinen, ist:

return true;

Also dieser Code:

var arr = ["one", "two", "three", "four", "five"];
$.each(arr, function(i) {
  if (arr[i] == 'three') {
    return true;
  }
  console.log(arr[i]);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

loggt one, two, four, five.

Paolo Bergantino
quelle
16
Um nur die aktuelle Iteration zu beenden, reicht es aus, nur "return" zurückzugeben. Und um alle Iterationen vorwärts zu beenden, geben Sie false zurück.
Saulius
7
Es ist erwähnenswert, dass dies funktioniert, da Sie sich innerhalb einer Funktion befinden, wenn dieser Code ausgeführt wird.
Ukuser32
wenn ich zurückkomme (arr [i] === 'drei'); warum funktioniert es nicht ??
Ajayv
Für mich bedeutet nicht falsch, dass Sie alles zurückgeben können, außer false zurückzugeben.
Hoang Trung
61

Mit 'return non-false' meinen sie, jeden Wert zurückzugeben, der nicht zu boolean false führen würde. So könnten Sie zurückkehren true, 1, 'non-false', oder was auch immer Sie denken können.

TJ L.
quelle
20
warum nicht nur aus expliziten Gründen "return 'continue';"
Alexander Mills
was ist mit weiter? das funktionierte in einer Variation von Cis, mit der ich gearbeitet habe, also
vermute
@Brandito Es läuft nicht wie eine normale Schleife - es ruft eine Funktion rekursiv auf. Damit die Schleife fortgesetzt werden kann, müssen Sie die Verarbeitung innerhalb der Funktion beenden.
TJ L
5

Javascript hat die Idee von "Wahrhaftigkeit" und "Falschheit". Wenn eine Variable einen Wert hat, hat sie im Allgemeinen 9 (wie Sie sehen werden) 'Wahrhaftigkeit' - null, oder kein Wert neigt zu 'Falschheit'. Die folgenden Ausschnitte könnten helfen:

var temp1; 
if ( temp1 )...  // false

var temp2 = true;
if ( temp2 )...  // true

var temp3 = "";
if ( temp3 ).... // false

var temp4 = "hello world";
if ( temp4 )...  // true

Hoffentlich hilft das?

Es lohnt sich auch, diese Videos von Douglas Crockford anzusehen

update: danke @cphpython für das Erkennen der defekten Links - ich habe aktualisiert, um jetzt auf funktionierende Versionen zu verweisen

Die Javascript-Sprache

Javascript - Die guten Teile

mlennox
quelle
1
Links sind kaputt ... 0Übrigens ist es auch ein falscher Wert und die Negation davon ist wahr (und umgekehrt zu jeder anderen Zahl, z !-42 === false. B. ).
CPHPython
4

Vergessen Sie nicht, dass Sie manchmal einfach vom Ende des Blocks fallen können, um zur nächsten Iteration zu gelangen:

$(".row").each( function() {
    if ( ! leaveTheLoop ) {
        ... do stuff here ...
    }
});

Anstatt tatsächlich so zurückzukehren:

$(".row").each( function() {
    if ( leaveTheLoop ) 
        return; //go to next iteration in .each()
    ... do stuff here ...
});
Lee Meador
quelle
3
Ich will nicht unhöflich sein, aber das ist schmerzlich schreckliches Design. Ich meine ... ich habe es in meinen ersten 2 College-Jahren getan, als ich es nicht besser wusste (selbst dann mochte ich es nicht), aber es ist nicht etwas, das empfohlen werden sollte ...
xDaizu
@ DanielParejoMuñoz, ich höre dich, aber wir sind nicht einverstanden. Die Entscheidung, keine return-Anweisung zu haben, gefällt Ihnen möglicherweise nicht. Aber ich würde behaupten, dass es eher eine Art / Abneigung als eine gute / schlechte Sache ist. Beides hat objektiv keine klaren Vorteile.
Lee Meador
4
Dies hat den Nachteil einer zunehmenden Verschachtelung
Dave Cousineau
3

Die Schleife wird nur unterbrochen, wenn Sie buchstäblich zurückkehren false. Ex:

// this is how jquery calls your function
// notice hard comparison (===) against false
if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
   break;
}

Dies bedeutet, dass Sie alles andere zurückgeben können, einschließlich dessen undefined, was Sie zurückgeben, wenn Sie nichts zurückgeben. Sie können also einfach eine leere return-Anweisung verwenden:

$.each(collection, function (index, item) {
   if (!someTestCondition)
      return; // go to next iteration

   // otherwise do something
});

Möglicherweise variiert dies je nach Version. Dies gilt für jquery 1.12.4. Aber wirklich, wenn Sie den unteren Rand der Funktion verlassen, geben Sie auch nichts zurück, und deshalb wird die Schleife fortgesetzt. Daher würde ich erwarten, dass es überhaupt keine Möglichkeit gibt, dass die Rückgabe von nichts die Schleife nicht fortsetzen kann. Es sei denn , sie alle zwingen wollen , etwas zu beginnen Rückkehr der Schleife in Gang zu halten, nichts Rückkehr hat einen Weg , um es zu halten.

Dave Cousineau
quelle
-3

jQuery.noop () kann helfen

$(".row").each( function() {
    if (skipIteration) {
        $.noop()
    }
    else{doSomething}
});
Melaxon
quelle
Nein, diese noop () -Funktion hilft in keiner Weise. Dies funktioniert nur, weil der Block "else" nicht aktiviert ist.
Rauni Lillemets