Estoy buscando una manera de detener las iteraciones de underscore.js _.each()
método , pero no puedo encontrar la solución. jQuery .each()
puede romperse si lo haces return false
.
¿Hay alguna manera de dejar de subrayar cada ()?
_([1,2,3]).each(function(v){
if (v==2) return /*what?*/;
})
forEach
función nativa tampoco ofrece esta característica.each
con un cierre (en la mayoría de los idiomas), primero desea filtrar su lista. De esa manera no tienes que preocuparte por romper con eso. En términos generales, si necesita salir temprano de una iteración, probablemente haya una forma diferente de hacerlo.each
cierre) es similar a JavaScript.Array.every
para emular el comportamiento que desea.Respuestas:
No puede romper con el
each
método: emula elforEach
comportamiento del método nativo y el nativoforEach
no proporciona escapar del ciclo (aparte de lanzar una excepción).¡Sin embargo, no todo está perdido! Puedes usar el
Array.every
método. :)Desde ese enlace:
En otras palabras, podría hacer algo complicado como este ( enlace a JSFiddle ):
Esto alertará
1
a través3
, y luego "romper" fuera de onda.Está utilizando underscore.js, por lo que le complacerá saber que sí proporciona un
every
método, lo llamanevery
, pero como ese enlace menciona, también proporcionan un alias llamadoall
.fuente
_.every()
un_.all()
método ni un método para las matrices en guión bajo, así que manténgase en elArray.every()
.every
. Así que ten cuidado con la legibilidad._.each()
tiene una nota específica sobre el hecho de que no puede salir del ciclo, y recomienda que lo use_.find()
en su lugar. http://underscorejs.org/#eachActualizar:
_.find sería mejor ya que sale del bucle cuando se encuentra el elemento:
** Antiguo **
Si desea salir de un bucle condicionalmente, use _.filter api en lugar de _.each. Aquí hay un fragmento de código
fuente
_.find
hace exactamente lo que se le pide: iterar sobre la lista hasta que regrese la devolución de llamadatrue
.Puedes echar un vistazo a en
_.some
lugar de_.each
._.some
deja de recorrer la lista una vez que un predicado es verdadero. Los resultados se pueden almacenar en una variable externa.Ver http://underscorejs.org/#some
fuente
fuente
Tal vez desee el subrayado any () o find (), que detendrá el procesamiento cuando se cumpla una condición.
fuente
Como las otras respuestas, es imposible. Aquí está el comentario sobre el interruptor en el subrayado subrayar el problema # 21
fuente
No puede romper un
forEach
guión bajo, ya que emula el comportamiento nativo de EcmaScript 5.fuente
Creo que si su matriz fuera realmente un objeto, podría regresar usando un objeto vacío.
fuente
http://underscorejs.org/#each
fuente
Actualizar:
En realidad, puede "romper" arrojando un error adentro y atrapándolo afuera: algo como esto:
Obviamente, esto tiene algunas implicaciones con respecto a cualquier otra excepción que su código active en el ciclo, ¡así que use con precaución!
fuente
trabajado en mi caso
fuente