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