"продолжить" в курсоре .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()
);