it-swarm.com.de

"weiter" in cursor.forEach ()

Ich erstelle eine App mit meteor.js und MongoDB und habe eine Frage zu cursor.forEach (). Ich möchte zu Beginn jeder Iteration einige Bedingungen überprüfen und dann das Element überspringen, wenn ich die Operation nicht ausführen muss, damit ich etwas Zeit sparen kann.

Hier ist mein 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();
  }
});

Ich weiß, dass ich den Cursor mit cursor.find (). Fetch () in ein Array umwandeln und dann mit der regulären for-Schleife über Elemente iterieren und mit continue und break normal fortfahren kann. ).

230
Drag0

Bei jeder Iteration von forEach() wird die von Ihnen angegebene Funktion aufgerufen. Um die weitere Verarbeitung innerhalb einer bestimmten Iteration anzuhalten (und mit dem nächsten Element fortzufahren), müssen Sie nur an der entsprechenden Stelle von der Funktion aus return:

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

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

Meiner Meinung nach ist der beste Ansatz, dies mit der filterMethode zu erreichen, da es sinnlos ist, in einem forEach -Block zurückzukehren. Ein Beispiel für Ihr Snippet:

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

Dies wird Ihr elementsCollection eingrenzen und nur die filtred Elemente behalten, die verarbeitet werden sollen.

9
Ramy Tamer

Verwendung von JavaScripts Kurzschluss Auswertung. Wenn el.shouldBeProcessed gibt true zurück, doSomeLengthyOperation

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

Hier ist eine Lösung mit for of und continue anstelle von 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