Tworzę aplikację za pomocą Mete.js i MongoDB i mam pytanie dotyczące kursora.forEach (). Chcę sprawdzić niektóre warunki na początku każdej iteracji forEach, a następnie pominąć element, jeśli nie muszę wykonywać na nim operacji, aby zaoszczędzić trochę czasu.
Oto mój kod:
// 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();
}
});
Wiem, że mogłem zamienić kursor na tablicę za pomocą kursora.find (). Fetch (), a następnie użyć zwykłej pętli for do iteracji elementów oraz użyć kontynuacji i przerwania normalnie, ale jestem zainteresowany, jeśli jest coś podobnego do użycia w forEach ( ).
javascript
mongodb
foreach
meteor
Przeciągnij0
źródło
źródło
return false;
będzie to odpowiednikbreak;
(tak jak w przypadku.each()
pętli jQuery ). Oczywiście, ktokolwiek wdrożył MongoDB,.forEach()
mógł mieć inne pomysły ...some
, pamiętaj jednak, że niewłaściwie używasz (lub twórczo używasz) funkcji, która miała na celu stwierdzenie, czy któryś z elementów spełnia ten warunek. Coś w stylu, gdy widzę, że ludzie używająmap
i ignorują wynik (powinni byli użyćforEach)
. To semantyka, ludzie będą musieli dwa razy spojrzeć, aby dowiedzieć się, dlaczego używasz,some
gdy tak naprawdę nie zależy ci na wynikureturn true
przerwie jakąś pętlęMoim zdaniem najlepsze podejście do osiągnięcia tego celu
filter
polega na zastosowaniu metody, ponieważ powrót doforEach
bloku nie ma sensu ; na przykład we fragmencie:Spowoduje to zawężenie twojego
elementsCollection
i zachowaniefiltred
elementów, które powinny być przetworzone.źródło
filter
a drugi wforEach
dużej kolekcji, byłoby bardzo nieefektywneO(2n)
może być uważana zaO(n)
.right
sposób..filter()
metody, więc musisz wywołać jej.toArray()
metodę, zanim będziesz mógł.filter()
Oto rozwiązanie wykorzystujące
for of
icontinue
zamiastforEach
:Może to być nieco bardziej przydatne, jeśli chcesz użyć funkcji asynchronicznych w pętli, które nie działają w środku
forEach
. Na przykład:źródło
Wykorzystanie oceny zwarć JavaScript . Jeśli
el.shouldBeProcessed
zwraca true,doSomeLengthyOperation
źródło