2013-08-26 6 views
136

Sto costruendo un'app utilizzando meteor.js e MongoDB e ho una domanda su cursor.forEach(). Voglio controllare alcune condizioni all'inizio di ogni opzione perOne e saltare l'elemento se non devo fare l'operazione su di esso in modo da poter risparmiare un po 'di tempo."continue" in cursor.forEachid()

Ecco il mio codice:

// 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(); 
    } 
}); 

So che avrei potuto girare cursore su array usando cursor.find() fetch() e quindi utilizzare regolare per-ciclo per scorrere sugli elementi e utilizzare continuare e pausa. normalmente, ma sono interessato se c'è qualcosa di simile da usare in forEach().

risposta

305

Ogni iterazione di forEach() chiama la funzione fornita. Per interrompere l'ulteriore elaborazione all'interno di un dato iterazione (e continuare con la voce successiva) non resta che return dalla funzione al momento opportuno:

elementsCollection.forEach(function(element){ 
    if (!element.shouldBeProcessed) 
    return; // stop processing this iteration 

    // This part will be avoided if not neccessary 
    doSomeLengthyOperation(); 
}); 
+12

Sai forse quale potrebbe essere la "pausa", quindi se continua è solo "ritorno". – Drag0

+4

Non uso MongoDB, quindi non ho letto la sua documentazione, ma è possibile che restituisca false; sarebbe l'equivalente di 'break;' (come lo è per un ciclo jQuery '.each()'). Ovviamente chiunque abbia implementato '.forEach()' di MongoDB potrebbe aver avuto altre idee ... – nnnnnn

+8

@ Drag0 È possibile utilizzare .some() come sostituto di .forEach(), che consente di restituire false per interrompere il ciclo. – Andrew

4

A mio parere l'approccio migliore per raggiungere questo obiettivo utilizzando il filtermethod poiché non ha senso tornare in un blocco forEach; per un esempio sul frammento:

// Fetch all objects in SomeElements collection 
var elementsCollection = SomeElements.find(); 
elementsCollection 
.filter(function(element) { 
    return element.shouldBeProcessed; 
}) 
.forEach(function(element){ 
    doSomeLengthyOperation(); 
}); 

Questo sarà restringere la elementsCollection e basta tenere gli filtred elementi che dovrebbero essere elaborati.

+0

Questo dovrebbe iterare gli elementi trovati due volte, una volta nel 'filter' e il secondo nel' forEach' se è una collezione di grandi dimensioni, sarà molto inefficiente – Dementic

+0

Hai ragione, ma non penso che sia un grosso problema come la complessità temporale di questo sarebbe 'O (2n)' che può essere considerato come 'O (n)'. –

+0

Considerando che SO viene utilizzato da altri, non solo l'OP, pubblicando una soluzione solo allo scopo di pubblicarlo, sta creando più danni che benefici. La risposta sopra lo fa in un'unica iterazione ed è il modo "giusto" per farlo. – Dementic

Problemi correlati