javascript jquery underscore.js

javascript - cómo romper la función_.each en underscore.js



jquery (11)

También es bueno tener en cuenta que cada bucle no se puede romper, para romper, use _.find en su lugar.

http://underscorejs.org/#each

Estoy buscando una manera de detener las iteraciones del _.each() underscore.js _.each() , pero no puedo encontrar la solución. jQuery .each() puede fallar si return false .

¿Hay una manera de dejar de subrayar cada ()?

_([1,2,3]).each(function(v){ if (v==2) return /*what?*/; })


Actualizar:

Realmente puedes "romper" lanzando un error adentro y atrapándolo afuera: algo como esto:

try{ _([1,2,3]).each(function(v){ if (v==2) throw new Error(''break''); }); }catch(e){ if(e.message === ''break''){ //break successful } }

Obviamente, esto tiene algunas implicaciones con respecto a cualquier otra excepción que su código desencadene en el ciclo, ¡así que use con precaución!


Actualizar:

_.find sería mejor, ya que se sale del bucle cuando se encuentra el elemento:

var searchArr = [{id:1,text:"foo"},{id:2,text:"bar"}]; var count = 0; var filteredEl = _.find(searchArr,function(arrEl){ count = count +1; if(arrEl.id === 1 ){ return arrEl; } }); console.log(filteredEl); //since we are searching the first element in the array, the count will be one console.log(count); //output: filteredEl : {id:1,text:"foo"} , count: 1

** Antiguo **

Si desea salir de un bucle condicionalmente, use _.filter api en lugar de _.each. Aquí hay un fragmento de código

var searchArr = [{id:1,text:"foo"},{id:2,text:"bar"}]; var filteredEl = _.filter(searchArr,function(arrEl){ if(arrEl.id === 1 ){ return arrEl; } }); console.log(filteredEl); //output: {id:1,text:"foo"}


Como las otras respuestas, es imposible. Aquí está el comentario sobre el factor de ruptura en el número 21 de subrayado.


Creo que si su matriz fuera en realidad un objeto que podría devolver utilizando un objeto vacío.

_.({1,2,3,4,5}).each(function(v){ if(v===3) return {}; });


No puede dividir un forEach en el guión bajo, ya que emula el comportamiento nativo de EcmaScript 5.


No se puede romper con each método: emula el comportamiento del método nativo forEach , y el forEach nativo no proporciona el escape del bucle (aparte de lanzar una excepción).

¡Sin embargo, no todo está perdido! Puede utilizar el método Array.every . :)

Desde ese enlace:

every ejecuta la función de callback proporcionada una vez para cada elemento presente en la matriz hasta que encuentra uno donde la callback devuelve un valor falso. Si se encuentra tal elemento, every método devuelve inmediatamente falso.

En otras palabras, podría hacer algo complicado como esto ( enlace a JSFiddle ):

[1, 2, 3, 4].every(function(n) { alert(n); return n !== 3; });

Esto alertará de 1 a 3 , y luego se "romperá" fuera del bucle.

Estás usando underscore.js, por lo que te complacerá saber que proporciona un método para every : lo llaman every , pero como lo menciona el enlace, también proporcionan un alias llamado all .


Puedes echar un vistazo a _.some lugar de _.each . _.some deja de recorrer la lista una vez que un predicado es verdadero. Los resultados pueden almacenarse en una variable externa.

_.some([1, 2, 3], function(v) { if (v == 2) return true; })

Ver http://underscorejs.org/#some


Tal vez desee el subrayado any () o find (), que detendrá el procesamiento cuando se cumpla una condición.


trabajó en mi caso

var arr2 = _.filter(arr, function(item){ if ( item == 3 ) return item; });


_([1,2,3]).find(function(v){ return v if (v==2); })