"продолжить" в курсоре .forEach()
Я создаю приложение, использующее 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 для итерации по элементам и использовать продолжение и прерывание нормально, но мне интересно, если есть что-то похожее на использование in forEach().
Ответы
Ответ 1
Каждая итерация forEach()
вызывает функцию, которую вы предоставили. Чтобы остановить дальнейшую обработку в любой заданной итерации (и продолжить со следующего пункта), вам нужно только return
от функции в соответствующей точке:
elementsCollection.forEach(function(element){
if (!element.shouldBeProcessed)
return; // stop processing this iteration
// This part will be avoided if not neccessary
doSomeLengthyOperation();
});
Ответ 2
На мой взгляд, лучший подход для достижения этой цели - использование метода filter
method, поскольку бессмысленно возвращаться в блок forEach
; например, в вашем фрагменте:
// Fetch all objects in SomeElements collection
var elementsCollection = SomeElements.find();
elementsCollection
.filter(function(element) {
return element.shouldBeProcessed;
})
.forEach(function(element){
doSomeLengthyOperation();
});
Это сузит ваш elementsCollection
и просто сохранит элементы filtred
, которые должны быть обработаны.
Ответ 3
Вот решение с использованием for of
и continue
вместо forEach
:
let elementsCollection = SomeElements.find();
for (let el of elementsCollection) {
// continue will exit out of the current
// iteration and continue on to the next
if (!el.shouldBeProcessed){
continue;
}
doSomeLengthyOperation();
});
Ответ 4
Использование оценки короткого замыкания JavaScripts. Если el.shouldBeProcessed
возвращает true, doSomeLengthyOperation
elementsCollection.forEach( el =>
el.shouldBeProcessed && doSomeLengthyOperation()
);