cursor.forEach ()에서“계속”


280

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-loop를 사용하여 요소를 반복하고 계속 사용하고 정상적으로 중단 할 수 있지만 forEach ( ).

답변:


561

를 반복 forEach()할 때마다 제공 한 함수가 호출됩니다. 주어진 반복 내에서 추가 처리를 중지하고 다음 항목을 계속 return하려면 적절한 시점에서 함수에서 수행하면됩니다.

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

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

18
"브레이크"가 무엇인지 계속 알고 있다면 계속 "반환"입니다.
Drag0

5
MongoDB를 사용하지 않으므로 설명서를 읽지 않았지만 (jQuery 루프 return false;의 경우와 동일) 가능할 수 있습니다 . 물론 MongoDB를 구현 한 사람 은 다른 아이디어를 가지고 있었을 수도있다.break;.each().forEach()
nnnnnn

9
@ Drag0 .some ()을 .forEach () 대신 사용할 수 있습니다. 그러면 루프를 해제하기 위해 false를 반환 할 수 있습니다.
Andrew

6
@Andrew 당신은 some요소 중 하나라도 조건과 일치하는지 알려주기위한 함수를 잘못 사용하거나 창의적으로 사용하고 있음을 알고 사용할 수 있습니다 . 사람들 map이 결과를 사용 하고 무시하는 것을 볼 때와 비슷한 종류 (결과는 사용되어야합니다 forEach). 의미 론적이며 사람들은 some결과에 대해 신경 쓰지 않을 때 왜 사용하고 있는지 알기 위해 두 번 살펴 봐야 합니다
Juan Mendes

1
@Andrew 큰 팁, 그러나 그것은 return true일부 루프를 끊을 것입니다
daviestar

11

제 생각에는 블록 으로 돌아가는 것은 무의미한 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.


3
이렇게하면 발견 된 요소를 두 번 반복 할 수 있습니다 (한 번에 한 번, 두 filter번째로 forEach큰 모음 인 경우). 매우 비효율적 일 것입니다.
Dementic

1
당신 말이 맞지만, 시간의 복잡성이 O(2n)로 간주 될 수 있기 때문에 그것이 큰 문제라고 생각하지 않습니다 O(n).
Ramy Tamer

2
SO뿐만 아니라 OP를 게시 할 목적으로 솔루션을 게시하는 것만으로도 다른 사람들이 SO를 사용한다는 점을 고려하면 이익보다 더 많은 해가 발생합니다. 위의 대답은 한 번의 반복 right으로 수행하며 수행 하는 방법입니다.
치매

영업 이익의 컬렉션 배열이 아닌 것을 참고, 그것은 것 같다하지 않는 몽고 DB 커서 객체의 .filter()당신이 전화를해야 할 것, 그래서 방법을 .toArray()당신이 전에 방법.filter()
여기서 nnnnnn

7

여기에 사용하여 솔루션 for ofcontinue대신은 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();

});

내부에서 작동하지 않는 루프 내부에서 비동기 함수를 사용해야하는 경우 좀 더 유용 할 수 있습니다 forEach. 예를 들면 다음과 같습니다.


(async fuction(){

for (let el of elementsCollection) {

    if (!el.shouldBeProcessed){
        continue;
    }

    let res;

    try {
        res = await doSomeLengthyAsyncOperation();
    } catch (err) {
        return Promise.reject(err)
    }

});

})()

2

JavaScript 단락 평가를 사용합니다. 만약 el.shouldBeProcessed, true를 반환doSomeLengthyOperation

elementsCollection.forEach( el => 
  el.shouldBeProcessed && doSomeLengthyOperation()
);
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.