una terminar salir romper funcion for detener destruir ciclo javascript jquery

javascript - terminar - Cómo salir de.each() y devolver un valor para una función



salir de una funcion en javascript (8)

Quiero usar return false para romper un .each () pero también devolver un valor al mismo tiempo. ¿Cómo puedo hacer esto?

Consulte una función alternativa para ver lo que estoy tratando de hacer:

function HasStores(state) { var statehasstores = false; $(stores).each(function (index, store) { if (state == store.state && store.category == "meyers") { statehasstores = true; return false; // break } }); return statehasstores; }

Lo que me gustaría hacer en pseudo código es:

Function () { for() { if found { return true; } } return false; }


Alternativamente, puede usar un bucle for lugar de each() , y simplemente devolver el valor.


Bueno, creo que hay una pequeña duda sobre este punto, así que tal vez lo esté haciendo más claro aquí:

  • Cuando jquery doc dice: "Podemos detener el bucle desde dentro de la función de devolución de llamada devolviendo falso". y lo hace :

    Function () {for () {si se encuentra {return true; }
    } falso retorno; }

Esto no significa que su función devolverá verdadero cuando encuentre el elemento buscado. En su lugar, siempre devolverá falso.

Así que para hacer que su función funcione como desee, me propongo hacerlo:

Function () { variable found = false; foreach() { if found { found = true; return false; // This statement doesn''t make your function return false but just cut the loop } } return found;

}

Por supuesto, hay muchas otras formas de realizar esto, pero creo que esta es la más sencilla.

Coopa - ¡Fácil!


Como otros han señalado en jQuery Each , devolver falso solo se interrumpirá desde el bucle, no devolverá el valor, pero devolverá verdadero pero continuará e inmediatamente comenzará la siguiente iteración. Con ese conocimiento, podrías simplificar un poco tu código así:

function HasStores(state) { var statehasstores = false; $(stores).each(function (index, store){ // continue or break; statehasstores = !(state == store.state && store.category == "meyers")) return statehasstores; }); return !statehasstores; }

Por supuesto, esto es un poco tonto al usar el doble negativo, y tiene el efecto secundario de guardar ''true'' en las tiendas de estado para cada iteración falsa y viceversa, sin embargo, el resultado final debe ser el mismo y ya no tendrá esa instrucción if.


Lo estás haciendo bien...

Cita de http://api.jquery.com/each/

"Podemos detener el bucle desde dentro de la función de devolución de llamada devolviendo falso".


Lo que estás sugiriendo es la forma de hacerlo. Pensaría en ello menos como una solución y más como un idioma.


Qué tal si:

$.each( myObj, function( key, value ){ ... if( sthg... ){ myObj.somethingWentHorriblyWrong = true; return false; } }); if( myObj.somethingWentHorriblyWrong ){ // ... do something, not forgetting to go: delete myObj.somethingWentHorriblyWrong; }

PS: inicialmente me interesaba lo que $.each(... realidad devuelve. Como se dice en la página JQ relevante , "El método devuelve su primer argumento, el objeto que se iteró", pero en realidad la solución ni siquiera requiere que uses ese hecho ...

PPS ¿Necesita una función que devuelva un valor? Envolver en una función externa, por supuesto.


Ser creativo:

try { $(stores).each(function (index, store) { if(state == store.state && store.category == "meyers"){ throw store; } }); } catch(e) { // you got e with the value }

No, solo estaba bromeando, no uses esto :). Vino como una idea que me gustaba compartir.


Utilice una variable fuera del bucle para obtener el valor y utilícelo después.

var value; $(stores).each(function (index, store) { if(state == store.state && store.category == "meyers"){ statehasstores = true; value = store; // added line return false; //break } }); alert(value);

La forma en que lo estás haciendo está bien. jsfiddle.net/aXkcW .

¿No está funcionando para ti? ¿Puedes mostrar más contexto?