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.
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 decallback
proporcionada una vez para cada elemento presente en la matriz hasta que encuentra uno donde lacallback
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;
})
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);
})