Saya membuat aplikasi menggunakan meteor.js dan MongoDB dan saya punya pertanyaan tentang cursor.forEach (). Saya ingin memeriksa beberapa kondisi di awal setiap iterasi forEach dan kemudian melewati elemen jika saya tidak harus melakukan operasi di atasnya sehingga saya dapat menghemat waktu.
Ini kode saya:
// 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();
}
});
Saya tahu saya bisa mengubah kursor ke array menggunakan cursor.find (). Fetch () dan kemudian menggunakan for-loop biasa untuk beralih ke elemen dan menggunakan melanjutkan dan merusak secara normal tapi saya tertarik jika ada sesuatu yang mirip untuk digunakan di forEach ( ).
sumber
return false;
setara denganbreak;
(seperti untuk.each()
loop jQuery ). Tentu saja siapa pun yang menerapkan MongoDB.forEach()
mungkin punya ide lain ...some
, hanya perlu diketahui bahwa Anda menyalahgunakan (atau secara kreatif menggunakan) fungsi yang dimaksudkan untuk mengetahui apakah ada elemen yang cocok dengan kondisi tersebut. Seperti ketika saya melihat orang menggunakanmap
dan mengabaikan hasilnya (mereka seharusnya menggunakannyaforEach)
. Ini semantik, orang harus melihat dua kali untuk mengetahui mengapa Anda menggunakansome
saat Anda tidak terlalu peduli dengan hasilnyareturn true
yang akan mematahkan beberapa loopMenurut pendapat saya pendekatan terbaik untuk mencapai ini dengan menggunakan
filter
metode karena tidak ada artinya untuk kembali dalam satuforEach
blok; untuk contoh di cuplikan Anda:Ini akan mempersempit Anda
elementsCollection
dan hanya menyimpanfiltred
elemen yang harus diproses.sumber
filter
dan yang kedua diforEach
jika itu adalah koleksi besar, itu akan sangat tidak efisienO(2n)
yang dapat dianggap sebagaiO(n)
.right
cara untuk melakukannya..filter()
metode, jadi Anda harus memanggil.toArray()
metode sebelum bisa.filter()
Ini adalah solusi menggunakan
for of
dancontinue
bukannyaforEach
:Ini mungkin sedikit lebih berguna jika Anda perlu menggunakan fungsi asinkron di dalam loop Anda yang tidak berfungsi di dalam
forEach
. Sebagai contoh:sumber
Memanfaatkan evaluasi hubung singkat JavaScripts . Jika
el.shouldBeProcessed
mengembalikan true,doSomeLengthyOperation
sumber