2013-08-26 55 views
136

Tôi đang xây dựng một ứng dụng bằng cách sử dụng meteor.js và MongoDB và tôi có một câu hỏi về cursor.forEach(). Tôi muốn kiểm tra một số điều kiện khi bắt đầu mỗi lần lặp lại và sau đó bỏ qua phần tử nếu tôi không phải thực hiện thao tác trên nó để tôi có thể tiết kiệm thời gian."tiếp tục" trong cursor.forEach()

Đây là mã của tôi:

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

Tôi biết tôi có thể biến con trỏ đến mảng sử dụng cursor.find() lấy() và sau đó sử dụng thường xuyên cho vòng lặp để lặp qua các yếu tố và sử dụng tiếp tục và nghỉ ngơi. bình thường nhưng tôi quan tâm nếu có cái gì đó tương tự để sử dụng trong forEach().

Trả lời

305

Mỗi lần lặp của forEach() sẽ gọi hàm mà bạn đã cung cấp. Để dừng chế biến tiếp trong bất kỳ lặp nhất định (và tiếp tục với mục kế tiếp) bạn chỉ cần return từ chức năng tại thời điểm thích hợp:

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

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

Bạn có biết những gì có thể là "phá vỡ" sau đó nếu tiếp tục chỉ là "trở lại;". – Drag0

+4

Tôi không sử dụng MongoDB vì vậy đã không đọc tài liệu của nó, nhưng có thể là 'return false;' sẽ là tương đương với 'break;' (vì nó là cho một vòng lặp jQuery '.each()'). Tất nhiên bất cứ ai đã triển khai '.forEach()' của MongoDB có thể có các ý tưởng khác ... – nnnnnn

+8

@ Drag0 Bạn có thể sử dụng .some() như là một thay thế cho .forEach(), cho phép bạn trả về false để phá vỡ vòng lặp. – Andrew

4

Theo tôi cách tiếp cận tốt nhất để đạt được điều này bằng cách sử dụng các filtermethod vì nó không có ý nghĩa để trở lại trong một khối forEach; cho một ví dụ về đoạn mã của bạn:

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

này sẽ thu hẹp elementsCollection của bạn và chỉ cần giữ filtred yếu tố đó phải được xử lý.

+0

Điều này sẽ lặp lại các phần tử tìm thấy hai lần, một lần trong 'bộ lọc' và phần tử thứ hai trong' forEach' nếu nó là một bộ sưu tập lớn, nó sẽ rất kém hiệu quả – Dementic

+0

Bạn nói đúng, nhưng tôi không nghĩ rằng nó là một vấn đề lớn như độ phức tạp thời gian của đây sẽ là 'O (2n)' có thể được coi là 'O (n) '. –

+0

Xem xét SO đang được sử dụng bởi những người khác, không chỉ OP, đăng một giải pháp chỉ với mục đích đăng tải nó, đang tạo ra nhiều tác hại hơn là tốt. Câu trả lời ở trên thực hiện nó trong một lần lặp lại và là cách 'đúng' để làm điều đó. – Dementic