Estoy creando una aplicación usando meteor.js y MongoDB y tengo una pregunta sobre cursor.forEach (). Quiero verificar algunas condiciones al comienzo de cada iteración y luego omitir el elemento si no tengo que hacer la operación para poder ahorrar algo de tiempo.
Aquí está mi código:
// Fetch all objects in SomeElements collection
var elementsCollection = SomeElements.find();
elementsCollection.forEach(function(element){
if (element.shouldBeProcessed == false){
// Here I would like to continue to the next element if this one
// doesn't have to be processed
}else{
// This part should be avoided if not neccessary
doSomeLengthyOperation();
}
});
Sé que podría convertir el cursor en matriz usando cursor.find (). Fetch () y luego usar el ciclo for regular para iterar sobre los elementos y usar continue y break normalmente, pero estoy interesado si hay algo similar para usar en forEach ( )
fuente
return false;
sea el equivalente debreak;
(como lo es para un.each()
bucle jQuery ). Por supuesto, quien implementó MongoDB.forEach()
puede haber tenido otras ideas ...some
, solo tenga en cuenta que está haciendo un mal uso (o está usando de manera creativa) una función que estaba destinada a determinar si alguno de los elementos coincide con la condición. Algo así como cuando veo que la gente usamap
e ignora el resultado (deberían haberlo usadoforEach)
. Es semántica, la gente tendrá que mirar dos veces para saber por qué estás usandosome
cuando realmente no te importa el resultadoreturn true
lo que romperá el círculoEn mi opinión, el mejor enfoque para lograr esto es usar el
filter
método ya que no tiene sentido regresar en unforEach
bloque; para un ejemplo en tu fragmento:Esto reducirá su
elementsCollection
y solo mantendrá losfiltred
elementos que deben procesarse.fuente
filter
segunda y la segundaforEach
si es una colección grande, será muy ineficienteO(2n)
que se puede considerarO(n)
.right
forma de hacerlo..filter()
método, por lo que debería llamar a su.toArray()
método antes de poder.filter()
Aquí hay una solución usando
for of
y encontinue
lugar deforEach
:Esto puede ser un poco más útil si necesita utilizar funciones asincrónicas dentro de su ciclo que no funcionan dentro
forEach
. Por ejemplo:fuente
Haciendo uso de la evaluación de cortocircuito JavaScripts . Si
el.shouldBeProcessed
devuelve verdadero,doSomeLengthyOperation
fuente