2013-08-26 15 views
136

Ben meteor.js ve MongoDB kullanarak bir uygulama yapıyorum ve cursor.forEach() hakkında bir sorum var. Her forEach yinelemesinin başlangıcındaki bazı koşulları kontrol etmek ve daha sonra işlem yapmak zorunda kalmazsam öğeyi atlamak için biraz zaman kazanabilirim. Ben cursor.find() kullanarak diziye imleci dönüşebilecek biliyorcursor.forEach içinde "devam"()

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

-döngü için elemanları üzerinde ilerlerken ve yola devam mola kullanmak düzenli kullanın sonra (getirme) ve: İşte

benim kodudur. normalde ama forEach() içinde kullanımı benzer bir şey varsa ilgileniyorum.

cevap

305

forEach()'un her yinelemesi, sağladığınız işlevi çağırır. filtermethod kullanarak bunu başarmak için Bence

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

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

Biliyor musunuz, belki de "geri dönüş" ise, "kırılma" ne olabilirdi. – Drag0

+4

MongoDB'yi kullanmıyorum, bu yüzden belgelerini okumadım, ancak 'false' iadesi, 'break' ('jQuery '.each()' döngüsü için olduğu gibi) olmalıdır. Tabii ki MongoDB'nin .forEach() 'ını uygulayan kişi başka fikirlere sahip olabilir ... – nnnnnn

+8

@ Drag0 Döngüleri kırmak için yanlış döndürmeniz için .forEach() yerine .some() kullanabilirsiniz. – Andrew

4

iyi yaklaşım: Sadece uygun noktada işlevinden return zorunda herhangi bir yineleme içinde daha fazla işlem durdurma (ve öğe ile devam) için forEach satırında dönmek anlamsız olduğu için; Snippet'inizdeki bir örnek için:

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

Bu elementsCollection daraltmak ve sadece işlenmelidir filtred unsurları tutacak.

+0

Bu iterate Bulunan elemanlar iki kez, bir kez filtre içinde ve ikincisi büyük bir koleksiyonsa, çok verimsiz olacak. – Dementic

+0

Haklısınız, ama bunun zaman karmaşıklığı kadar önemli olduğunu düşünmüyorum. Bu O (2n) 'olacak ve O (n)' olarak kabul edilebilir. –

+0

SO sadece başkaları tarafından kullanıldığını düşünürken, sadece OP'yi değil, sadece gönderme amacıyla bir çözüm yollamakta, iyiden daha fazla zarar yaratmaktadır. Yukarıdaki cevap, bir yinelemede yapar ve bunu yapmak için 'doğru' yoldur. – Dementic

İlgili konular