web-dev-qa-db-fra.com

"continue" dans cursor.forEach ()

Je construis une application en utilisant meteor.js et MongoDB et j'ai une question à propos de cursor.forEach (). Je souhaite vérifier certaines conditions au début de chaque itération forEach, puis ignorer l'élément si je n'ai pas à effectuer l'opération pour pouvoir gagner du temps.

Voici mon code:

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

Je sais que je pourrais transformer le curseur en tableau à l'aide de cursor.find (). Fetch (), puis utiliser une boucle for régulière pour parcourir les éléments et utiliser continue et break normalement, mais cela m'intéresse s'il existe quelque chose de similaire à utiliser dans forEach ( ).

230
Drag0

Chaque itération de la forEach() appellera la fonction que vous avez fournie. Pour arrêter le traitement ultérieur dans une itération donnée (et continuer avec l'item suivant), il vous suffit de return à partir de la fonction au point approprié:

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

  // This part will be avoided if not neccessary
  doSomeLengthyOperation();
});
469
nnnnnn

À mon avis, la meilleure approche pour y parvenir consiste à utiliser la méthode filterméthode car il est inutile de revenir dans un bloc forEach; pour un exemple sur votre extrait:

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

Cela va restreindre votre elementsCollection et ne conserver que les éléments filtred à traiter.

9
Ramy Tamer

Utilisation de JavaScripts court-circuit évaluation. Si el.shouldBeProcessed renvoie true, doSomeLengthyOperation

elementsCollection.forEach( el => 
  el.shouldBeProcessed && doSomeLengthyOperation()
);
0
JSON C11

Voici une solution utilisant for of et continue au lieu de 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();

});
_
0
jwerre