Я создаю приложение, используя meteor.js и MongoDB, и у меня есть вопрос о cursor.forEach (). Я хочу проверить некоторые условия в начале каждой итерации forEach, а затем пропустить элемент, если мне не нужно выполнять над ним операцию, чтобы сэкономить время.
Вот мой код:
// 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();
}
});
Я знаю, что могу превратить курсор в массив, используя cursor.find (). Fetch (), а затем использовать обычный цикл for для перебора элементов и использовать continue и break нормально, но мне интересно, есть ли что-то похожее для использования в forEach ( ).
источник
return false;
было бы эквивалентноbreak;
(как для.each()
цикла jQuery ). Конечно, кто бы ни реализовывал MongoDB,.forEach()
у него могли быть другие идеи ...some
, просто имейте в виду, что вы неправильно используете (или творчески используете) функцию, которая должна была сказать, соответствует ли какой-либо элемент условию. В некотором роде, когда я вижу, как люди используютmap
и игнорируют результат (они должны были использоватьforEach)
. Это семантика, люди должны будут дважды взглянуть, чтобы понять, почему вы используете,some
когда вы на самом деле не заботитесь о результатеreturn true
На мой взгляд, лучший подход для достижения этого - использовать
filter
метод, так как возвращать вforEach
блок бессмысленно ; для примера в вашем фрагменте:Это сузит ваш кругозор
elementsCollection
и просто сохранитfiltred
элементы, которые должны быть обработаны.источник
filter
и второй вforEach
случае, если это большая коллекция, это будет очень неэффективноO(2n)
может рассматриваться какO(n)
.right
способом сделать это..filter()
метода, поэтому вам придется вызывать его.toArray()
метод, прежде чем вы сможете это сделать.filter()
Вот решение с использованием
for of
иcontinue
вместоforEach
:Это может быть немного более полезно, если вам нужно использовать асинхронные функции внутри цикла, которые не работают внутри
forEach
. Например:источник
Использование оценки короткого замыкания JavaScripts . Если
el.shouldBeProcessed
возвращает true,doSomeLengthyOperation
источник