Comment passer à la prochaine itération dans jQuery.each () util?

434

J'essaie de parcourir un tableau d'éléments. La documentation de jQuery indique:

documentation jquery.Each ()

Renvoyer non-false est identique à une instruction continue dans une boucle for, il sautera immédiatement à l'itération suivante.

J'ai essayé d'appeler 'return non-false;' et «non faux»; (sans retour) aucun des deux ne passe à l'itération suivante. Au lieu de cela, ils rompent la boucle. Qu'est-ce que je rate?

Josh
la source
9
Dans leur sagesse infinie, les bods de jQuery ont maintenant supprimé cette note de la documentation - ou du moins, ce n'est pas dans la page pour each () . Je suis donc très heureux de voir que cette question peut toujours être trouvée ici sur SO, et par extension sur Google, car c'est l'une de ces choses simples que j'oublie toujours :)
Doug McLean

Réponses:

783

Ce qu'ils entendent par non faux est:

return true;

Donc, ce 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>

se connectera one, two, four, five.

Paolo Bergantino
la source
16
Pour quitter uniquement l'itération en cours, il suffit de renvoyer 'return'. Et pour quitter toutes les itérations, retournez false.
Saulius
7
Cela vaut la peine de dire que cela fonctionne parce que vous êtes dans une fonction lorsque ce code est exécuté.
Ukuser32
quand je reviens (arr [i] === 'trois'); pourquoi ça ne marche pas ??
ajayv
Pour moi, non-false signifie que vous pouvez renvoyer n'importe quoi sauf return false;
Hoang Trung
61

Par «retourner non faux», ils signifient renvoyer toute valeur qui ne fonctionnerait pas comme booléenne false. Ainsi , vous pouvez revenir true, 1, 'non-false'ou tout ce que vous pouvez imaginer.

TJ L
la source
20
pourquoi pas juste pour des raisons d'explicités "retour" continuer ";"
Alexander Mills
qu'en est-il de continuer? qui fonctionnait dans une variation de C forte avec laquelle je travaillais, donc je suppose que cela aurait un effet similaire dans JS
Brandito
@Brandito Il ne fonctionne pas comme une boucle normale - il appelle une fonction récursivement, donc pour que la boucle continue, vous devez terminer le traitement à l'intérieur de la fonction.
TJ L
5

Javascript a en quelque sorte l'idée de «véracité» et de «fausseté». Si une variable a une valeur, alors généralement 9 comme vous le verrez) elle a la «véracité» - nulle, ou aucune valeur ne tend à la «fausseté». Les extraits ci-dessous peuvent vous aider:

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

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

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

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

Espérons que cela aide?

En outre, cela vaut la peine de regarder ces vidéos de Douglas Crockford

mise à jour: merci @cphpython pour avoir repéré les liens rompus - j'ai mis à jour pour pointer vers les versions de travail maintenant

Le langage Javascript

Javascript - Les bonnes parties

mlennox
la source
1
Les liens sont rompus ... Btw, 0est également une valeur fausse et la négation de celle-ci est véridique (et vice-versa à tout autre nombre, par exemple !-42 === false).
CPHPython
4

N'oubliez pas que vous pouvez parfois simplement tomber de la fin du bloc pour passer à la prochaine itération:

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

Plutôt que de revenir comme ça:

$(".row").each( function() {
    if ( leaveTheLoop ) 
        return; //go to next iteration in .each()
    ... do stuff here ...
});
Lee Meador
la source
3
Je ne veux pas être impoli, mais c'est un design terriblement horrible. Je veux dire ... je l'ai fait, dans mes 2 premières années de collège, quand je ne savais pas mieux (même alors je ne l'
aimais
@ DanielParejoMuñoz, je vous entends, mais nous ne sommes pas d'accord. Le choix de ne pas avoir de déclaration de retour peut ne pas vous plaire. Mais je dirais que c'est une chose que j'aime / que je n'aime pas plutôt qu'une bonne / mauvaise chose. Ni l'un ni l'autre n'a d'objectifs clairs.
Lee Meador
4
cela a l'inconvénient d'augmenter la nidification
Dave Cousineau
3

La boucle ne se brise que si vous revenez littéralement false. Ex:

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

Cela signifie que vous pouvez retourner n'importe quoi d'autre, y compris undefinedce que vous retournez si vous ne retournez rien, vous pouvez donc simplement utiliser une instruction de retour vide:

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

   // otherwise do something
});

Il est possible que cela varie selon la version; cela s'applique à jquery 1.12.4. Mais vraiment, lorsque vous quittez le bas de la fonction, vous ne retournez rien non plus, et c'est pourquoi la boucle continue, donc je m'attends à ce qu'il n'y ait aucune possibilité que retourner rien ne puisse pas continuer la boucle. Sauf s'ils veulent forcer tout le monde à commencer à retourner quelque chose pour maintenir la boucle, rien ne doit être un moyen de continuer.

Dave Cousineau
la source
-3

jQuery.noop () peut vous aider

$(".row").each( function() {
    if (skipIteration) {
        $.noop()
    }
    else{doSomething}
});
melaxon
la source
Non, cette fonction noop () n'aide en aucune façon. Cela ne fonctionne que parce que le bloc "else" n'est pas activé.
Rauni Lillemets