Come saltare alla prossima iterazione in util jQuery.each ()?


434

Sto cercando di iterare attraverso una serie di elementi. La documentazione di jQuery dice:

jquery.Each () documentazione

Restituire non-false è lo stesso di un'istruzione continue in un ciclo for, salterà immediatamente alla successiva iterazione.

Ho provato a chiamare 'return non-false;' e "non falso;" (senza ritorno) nessuno dei quali passa alla successiva iterazione. Invece, interrompono il ciclo. Cosa mi sto perdendo?


9
Nella loro infinita saggezza, i corpi di jQuery hanno ora rimosso questa nota dalla documentazione - o almeno, non è nella pagina per ognuno () . Quindi sono molto felice di vedere che questa domanda può ancora essere trovata qui su SO, e per estensione su Google, poiché questa è una di quelle cose semplici che dimentico sempre :)
Doug McLean

Risposte:


783

Cosa significano per non falso è:

return true;

Quindi questo codice:

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>

registrerà one, two, four, five.


16
Per uscire solo dall'iterazione corrente è sufficiente solo restituire 'return'. E per uscire da tutte le iterazioni, restituire false
Saulius,

7
Vale la pena dire che questo funziona perché ci si trova all'interno di una funzione quando viene eseguito questo codice.
Ukuser32,

quando ritorno (arr [i] === 'tre'); perché non funziona ??
Ajayv,

Per me, non falso, puoi restituire qualsiasi cosa tranne restituire falso;
Hoang Trung,

61

Con "return non-false", significano restituire qualsiasi valore che non si risolva in false booleane. Così si potrebbe tornare true, 1, 'non-false', o qualsiasi altra cosa si può pensare su.


20
perché non solo per motivi di chiarezza "return 'continue';"
Alexander Mills,

che ne dici di continuare? che ha funzionato in una variante di C sharp con cui ho lavorato, quindi immagino solo che avrebbe un effetto simile in JS
Brandito,

@Brandito Non funziona come un normale ciclo - sta chiamando una funzione in modo ricorsivo, quindi per continuare il ciclo è necessario terminare l'elaborazione all'interno della funzione.
TJ L

5

Javascript ha in qualche modo l'idea di "verità" e "falsità". Se una variabile ha un valore, generalmente 9 come vedrai) ha "verità" - nulla o nessun valore tende a "falsità". I frammenti di seguito potrebbero aiutare:

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

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

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

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

Spero che questo aiuti?

Inoltre, vale la pena dare un'occhiata a questi video di Douglas Crockford

aggiornamento: grazie @cphpython per aver individuato i collegamenti non funzionanti - ho aggiornato per puntare alle versioni funzionanti ora

Il linguaggio Javascript

Javascript - Le parti buone


1
I collegamenti sono interrotti ... A proposito, 0è anche un valore falso e la sua negazione è vera (e viceversa rispetto a qualsiasi altro numero, ad esempio !-42 === false).
CPHPython,

4

Non dimenticare che a volte puoi semplicemente cadere dalla fine del blocco per arrivare alla prossima iterazione:

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

Invece di tornare effettivamente in questo modo:

$(".row").each( function() {
    if ( leaveTheLoop ) 
        return; //go to next iteration in .each()
    ... do stuff here ...
});

3
Non intendo essere scortese, ma questo è un design dolorosamente orribile. Voglio dire ... l'ho fatto, nei miei 2 primi anni di college, quando non sapevo di meglio (anche allora non mi piaceva), ma non è qualcosa che dovrebbe essere consigliato ...
xDaizu

@ DanielParejoMuñoz, ti sento, ma non siamo d'accordo. La scelta di non avere una dichiarazione di ritorno potrebbe non essere qualcosa che ti piace. Ma direi che è una cosa che mi piace / non piace piuttosto che una cosa buona / cattiva. Nessuno dei due ha chiari vantaggi oggettivamente.
Lee Meador,

4
questo ha lo svantaggio di aumentare la nidificazione
Dave Cousineau,

3

Il ciclo si interrompe solo se torni letteralmente false. Ex:

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

Ciò significa che puoi restituire qualsiasi altra cosa, incluso undefined, che è ciò che restituisci se non restituisci nulla, quindi puoi semplicemente utilizzare un'istruzione di reso vuota:

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

   // otherwise do something
});

È possibile che ciò possa variare in base alla versione; questo è applicabile per jquery 1.12.4. Ma davvero, quando esci dal fondo della funzione, non stai anche restituendo nulla, ed è per questo che il ciclo continua, quindi mi aspetto che non ci sia alcuna possibilità che restituire nulla non possa continuare il ciclo. A meno che non vogliano costringere tutti a iniziare a restituire qualcosa per mantenere il ciclo in corso, restituire nulla deve essere un modo per farlo andare avanti.


-3

jQuery.noop () può aiutare

$(".row").each( function() {
    if (skipIteration) {
        $.noop()
    }
    else{doSomething}
});

No, questa funzione noop () non aiuta in alcun modo. Funziona solo perché il blocco "else" non è attivato.
Rauni Lillemets,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.