Jak przejść do następnej iteracji w jQuery.each () util?

434

Próbuję iterować przez szereg elementów. Dokumentacja jQuery mówi:

Dokumentacja jquery.Each ()

Zwracanie wartości innej niż false jest takie samo, jak instrukcja Kontynuuj w pętli for, spowoduje to natychmiastowe przejście do następnej iteracji.

Próbowałem nazwać „return non-false”; i „nie-fałsz”; (bez powrotu) żadne z nich nie przechodzi do następnej iteracji. Zamiast tego przerywają pętlę. Czego mi brakuje?

Josh
źródło
9
W swojej nieskończonej mądrości treści w jQuery usunęły teraz tę notatkę z dokumentacji - a przynajmniej nie ma jej na stronie dla każdego () . Bardzo się cieszę, że to pytanie wciąż można znaleźć tutaj na SO, a co za tym idzie w Google, ponieważ jest to jedna z tych prostych rzeczy, o których zawsze zapominam :)
Doug McLean

Odpowiedzi:

783

Przez nie-fałsz rozumieją:

return true;

Więc ten kod:

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>

zanotuje one, two, four, five.

Paolo Bergantino
źródło
16
Aby wyjść tylko z bieżącej iteracji, wystarczy zwrócić „return”. I aby wyjść ze wszystkich iteracji do przodu, zwróć false.
Saulius
7
Warto powiedzieć, że to działa, ponieważ jesteś w funkcji, gdy ten kod jest wykonywany.
Ukuser32
kiedy wrócę (arr [i] === „trzy”); dlaczego to nie działa?
ajayv 29.04.16
Dla mnie, nie-fałszywy sposób, możesz zwrócić wszystko oprócz zwrotu fałszywe;
Hoang Trung
61

Przez „zwróć nie-fałsz” rozumieją, że zwracają dowolną wartość, która nie zadziałałaby na boolean fałsz. Więc można wrócić true, 1, 'non-false', lub cokolwiek innego, co może wymyślić.

TJ L.
źródło
20
dlaczego nie tylko ze względów wyjaśniających „powrót” kontynuuj ”;
Alexander Mills,
a co z kontynuowaniem ;? który działał w wariancie C
Sharp,
@Brandito Nie działa jak normalna pętla - wywołuje funkcję rekurencyjnie, więc aby pętla mogła być kontynuowana, musisz zakończyć przetwarzanie wewnątrz funkcji.
TJ L
5

JavaScript w pewnym sensie ma pojęcie „prawdy” i „fałszu”. Jeśli zmienna ma wartość, to na ogół 9 jak zobaczysz) ma „prawdziwość” - zero, lub żadna wartość nie prowadzi do „fałszu”. Poniższe fragmenty mogą pomóc:

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

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

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

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

Mam nadzieję, że to pomaga?

Warto również sprawdzić te filmy z Douglas Crockford

aktualizacja: dzięki @cphpython za wykrycie niedziałających linków - zaktualizowałem teraz, by wskazywać na działające wersje

Język JavaScript

JavaScript - dobre części

mlennox
źródło
1
Linki są zerwane ... Przy okazji, 0jest to również wartość fałsz, a negacja jest prawdziwa (i odwrotnie, na przykład do dowolnej innej liczby !-42 === false).
CPHPython
4

Nie zapominaj, że czasami możesz po prostu spaść z końca bloku, aby przejść do następnej iteracji:

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

Zamiast wracać w ten sposób:

$(".row").each( function() {
    if ( leaveTheLoop ) 
        return; //go to next iteration in .each()
    ... do stuff here ...
});
Lee Meador
źródło
3
Nie chcę być niegrzeczny, ale jest to bolesnie okropny projekt. Mam na myśli ... Zrobiłem to w ciągu dwóch pierwszych lat studiów, kiedy nie wiedziałem lepiej (nawet wtedy mi się nie podobało), ale nie jest to coś, co należy
poradzić
@ DanielParejoMuñoz, słyszę cię, ale się nie zgadzamy. Wybór braku instrukcji zwrotnej może nie być czymś, co lubisz. Ale twierdzę, że jest to coś podobnego / nie lubię, a nie coś dobrego / złego. Obiektywnie nie ma też wyraźnych zalet.
Lee Meador
4
ma to tę wadę, że zwiększa się zagnieżdżanie
Dave Cousineau,
3

Pętla przerywa się tylko wtedy, gdy powrócisz dosłownie false. Dawny:

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

Oznacza to, że możesz zwrócić cokolwiek innego, w tym undefined, co zwrócisz, jeśli nic nie zwrócisz, więc możesz po prostu użyć pustej instrukcji return:

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

   // otherwise do something
});

Możliwe, że może się to różnić w zależności od wersji; dotyczy to jquery 1.12.4. Ale tak naprawdę, kiedy wyjdziesz z dolnej części funkcji, również nic nie zwracasz, i dlatego pętla trwa, więc oczekiwałbym, że nie ma żadnej możliwości, że nic nie zwróci pętli. O ile nie chcą zmusić wszystkich do zwrócenia czegoś, aby utrzymać pętlę, nic nie musi być sposobem na utrzymanie.

Dave Cousineau
źródło
-3

jQuery.noop () może pomóc

$(".row").each( function() {
    if (skipIteration) {
        $.noop()
    }
    else{doSomething}
});
melakson
źródło
Nie, ta funkcja noop () nie pomaga w żaden sposób. Działa tylko dlatego, że blok „else” nie jest aktywowany.
Rauni Lillemets,