¿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?


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.


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.


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


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 ...
});

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.


-3

jQuery.noop () puede ayudar

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

No, esta función noop () no ayuda de ninguna manera. Funciona solo porque el bloque "else" no está activado.
Rauni Lillemets
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.