web-dev-qa-db-ja.com

cursor.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ループを使用して要素を繰り返し、通常はcontinueとbreakを使用することができますが、forEach( ).

220
Drag0

forEach()を繰り返すたびに、指定した関数が呼び出されます。与えられた反復内でそれ以上の処理をやめる(そして次の項目に進む)には、適切な時点で関数からreturnを実行するだけです。

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

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

私の意見では、filterブロックで返すのは意味がないので、forEachメソッド を使用してこれを達成するための最善の方法です。あなたのスニペットの例としては:

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

これはあなたのelementsCollectionを絞り込み、処理すべきfiltred要素をそのままにしておきます。

9
Ramy Tamer

JavaScriptを利用する 短絡 評価。 el.shouldBeProcessedがtrueを返す場合、doSomeLengthyOperation

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

continueの代わりに for of および 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