¿Cómo saltar a la siguiente iteración en jQuery.each () util?

434

Estoy tratando de iterar a través de una serie de elementos. La documentación de jQuery dice:

jquery.Each () documentación

Devolver no falso es lo mismo que una declaración de continuación en un bucle for, saltará inmediatamente a la siguiente iteración.

He intentado llamar a 'return non-false'; y 'no falso'; (sin retorno) ninguno de los cuales salta a la siguiente iteración. En cambio, rompen el ciclo. ¿Qué me estoy perdiendo?

Josh
fuente
99
En su sabiduría infinita, los cuerpos en jQuery ahora han eliminado esta nota de la documentación, o al menos, no está en la página para cada () . Así que estoy muy contento de ver que esta pregunta todavía se puede encontrar aquí en SO, y por extensión en Google, ya que esta es una de esas cosas simples que siempre olvido :)
Doug McLean

Respuestas:

783

Lo que quieren decir con no falso es:

return true;

Entonces este código:

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>

registrará one, two, four, five.

Paolo Bergantino
fuente
16
Para salir solo de la iteración actual es suficiente solo devolver 'return'. Y para salir de todas las iteraciones hacia adelante, devuelve falso.
Saulius
77
Vale la pena decir que esto funciona porque estás dentro de una función cuando se ejecuta este código.
Ukuser32
cuando regrese (arr [i] === 'tres'); ¿Por qué no funciona?
ajayv
Para mí, no falso significa, puede devolver cualquier cosa excepto devolver falso;
Hoang Trung el
61

Por 'retorno no falso', significan devolver cualquier valor que no resulte a booleano falso. Por lo que podría volver true, 1, 'non-false', o cualquier otra cosa que pueda imaginar.

TJ L
fuente
20
¿por qué no solo por razones de explicidades? "return 'continue';"
Alexander Mills
¿Qué hay de continuar? que funcionó en una variación de C sharp con la que trabajé, así que solo supongo que tendría un efecto similar en JS
Brandito
@Brandito No se está ejecutando como un bucle normal: está llamando a una función de forma recursiva, por lo que para que el bucle continúe, debe finalizar el procesamiento dentro de la función.
TJ L
5

Javascript tiene la idea de "veracidad" y "falsedad". Si una variable tiene un valor, generalmente, como verá, tiene "veracidad": nula o ningún valor tiende a "falsedad". Los fragmentos a continuación pueden ayudar:

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

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

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

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

Espero que eso ayude?

Además, vale la pena ver estos videos de Douglas Crockford

actualización: gracias @cphpython por detectar los enlaces rotos - He actualizado para apuntar a versiones que funcionan ahora

El lenguaje Javascript

Javascript - Las partes buenas

mlennox
fuente
1
Los enlaces están rotos ... Por cierto, 0también es un valor falso y la negación del mismo es verdadera (y viceversa a cualquier otro número, por ejemplo !-42 === false).
CPHPython
4

No olvide que a veces puede caerse del final del bloque para pasar a la siguiente iteración:

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

En lugar de regresar de esta manera:

$(".row").each( function() {
    if ( leaveTheLoop ) 
        return; //go to next iteration in .each()
    ... do stuff here ...
});
Lee Meador
fuente
3
No quiero ser grosero, pero este es un diseño terriblemente horrible. Quiero decir ... Lo hice, en mis 2 primeros años de universidad, cuando no sabía mejor (incluso entonces no me gustaba), pero no es algo que deba ser aconsejado ...
xDaizu
@ DanielParejoMuñoz, te escucho, pero no estamos de acuerdo. La opción de no tener una declaración de devolución puede no ser algo que le guste. Pero diría que es una cosa de me gusta / disgusto en lugar de algo bueno / malo. Ninguno de los dos tiene claras ventajas objetivas.
Lee Meador
44
esto tiene la desventaja de aumentar la anidación
Dave Cousineau
3

El ciclo solo se rompe si regresas literalmente false. Ex:

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

Esto significa que puede devolver cualquier otra cosa, incluido undefined, que es lo que devuelve si no devuelve nada, por lo que simplemente puede usar una declaración de devolución vacía:

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

   // otherwise do something
});

Es posible que esto varíe según la versión; Esto es aplicable para jquery 1.12.4. Pero realmente, cuando sale de la parte inferior de la función, tampoco está devolviendo nada, y es por eso que el ciclo continúa, por lo que esperaría que no haya ninguna posibilidad de que devolver nada no pueda continuar el ciclo. A menos que quieran obligar a todos a comenzar a devolver algo para mantener el ciclo en marcha, devolver nada tiene que ser una forma de mantenerlo en marcha.

Dave Cousineau
fuente
-3

jQuery.noop () puede ayudar

$(".row").each( function() {
    if (skipIteration) {
        $.noop()
    }
    else{doSomething}
});
melaxon
fuente
No, esta función noop () no ayuda de ninguna manera. Funciona solo porque el bloque "else" no está activado.
Rauni Lillemets