Apa cara terbaik untuk memecah dari loop bersarang di Javascript?
//Write the links to the page.
for (var x = 0; x < Args.length; x++)
{
for (var Heading in Navigation.Headings)
{
for (var Item in Navigation.Headings[Heading])
{
if (Args[x] == Navigation.Headings[Heading][Item].Name)
{
document.write("<a href=\""
+ Navigation.Headings[Heading][Item].URL + "\">"
+ Navigation.Headings[Heading][Item].Name + "</a> : ");
break; // <---HERE, I need to break out of two loops.
}
}
}
}
javascript
loops
nested-loops
break
Gary Willoughby
sumber
sumber
Jawaban:
Sama seperti Perl,
sebagaimana didefinisikan dalam EMCA-262 bagian 12.12. [MDN Documents]
Tidak seperti C, label ini hanya dapat digunakan untuk
continue
danbreak
, karena Javascript tidak memilikigoto
.sumber
continue
danbreak
.Bungkus itu dalam suatu fungsi dan kemudian adil
return
.sumber
Saya sedikit terlambat ke pesta tetapi berikut ini adalah pendekatan agnostik bahasa yang tidak menggunakan GOTO / label atau pembungkus fungsi:
Pada sisi atas mengalir secara alami yang seharusnya menyenangkan kerumunan non-GOTO. Pada sisi negatifnya, loop dalam perlu menyelesaikan iterasi saat ini sebelum mengakhiri sehingga mungkin tidak berlaku dalam beberapa skenario.
sumber
break
ataucontinue
segera setelah Anda mengatur z dan y? Saya suka ide menggunakan kondisifor
loop untuk menendang keluar. Elegan dengan caranya sendiri.Saya menyadari bahwa ini adalah topik yang sangat lama, tetapi karena pendekatan standar saya belum ada di sini, saya pikir saya mempostingnya untuk googler masa depan.
sumber
condition
dievaluasitrue
pada iterasi pertama dari loop bersarang, Anda masih menjalankan sisa 10 iterasi, memeriksaabort
nilai setiap kali. Ini bukan masalah kinerja untuk 10 iterasi, tetapi itu akan dengan, katakanlah, 10.000.abort
dan ekspresi. Dalam skenario sederhana yang mungkin baik-baik saja, tetapi untuk loop besar dengan iterasi trilyun yang bisa menjadi masalahBagaimana dengan itu? :)
sumber
x
, jika ada logika di dalam loop yang merujuk x pada titik waktu berikutnya (misalnya ia mendefinisikan fungsi anonim dalam yang disimpan dan dieksekusi kemudian), nilai untuk x akan menjadi apa pun berada di akhir loop, bukan indeks fungsi yang didefinisikan selama. (lanjutan)x
sebagai parameter ke fungsi anonim Anda sehingga membuat salinan baru, yang kemudian dapat direferensikan sebagai penutupan karena tidak akan berubah sejak saat itu. Singkatnya, saya merekomendasikan jawaban ephemient.Cukup sederhana:
sumber
loop1=loop2=false;
Berikut adalah lima cara untuk keluar dari loop bersarang di JavaScript:
1) Setel perulangan ke akhir
2) Gunakan label
3) Gunakan variabel
4) Gunakan fungsi self-executing
5) Gunakan fungsi biasa
sumber
break 2;
seperti yang kita miliki di PHP. Tidak ada label loop, tidak ada fungsi, tidak ada pemeriksaan if-else, tidak ada tempering dengan / peledakan variabel loop - cukup bersihkan sintaks!Bagaimana kalau menggunakan tidak ada istirahat sama sekali, tidak ada membatalkan bendera, dan tidak ada pemeriksaan kondisi tambahan. Versi ini hanya menghancurkan variabel loop (membuatnya
Number.MAX_VALUE
) ketika kondisi terpenuhi dan memaksa semua loop untuk mengakhiri dengan elegan.Ada jawaban ish yang serupa untuk loop bertipe tipe decrementing, tetapi ini berfungsi untuk loop bertingkat tipe incrementing tanpa perlu mempertimbangkan nilai terminasi setiap loop untuk loop sederhana.
Contoh lain:
sumber
Bagaimana dengan mendorong loop ke batas akhir mereka
sumber
Jika Anda menggunakan Coffeescript, ada kata kunci "do" yang nyaman yang membuatnya lebih mudah untuk didefinisikan dan segera menjalankan fungsi anonim:
... jadi Anda cukup menggunakan "kembali" untuk keluar dari loop.
sumber
for
loop, bukan dua.Saya pikir saya akan menunjukkan pendekatan pemrograman fungsional. Anda dapat keluar dari fungsi Array.prototype.some () dan / atau Array.prototype.every (), seperti di solusi saya. Manfaat tambahan dari pendekatan ini adalah bahwa
Object.keys()
enumerasi hanya properti enumerable objek sendiri, sedangkan "for-in loop menyebutkan properti dalam rantai prototipe juga" .Dekat dengan solusi OP:
Solusi yang mengurangi iterasi pada Judul / Item:
sumber
Sudah disebutkan sebelumnya oleh swilliams , tetapi dengan contoh di bawah ini (Javascript):
sumber
Hmmm hai ke pesta 10 tahun?
Mengapa tidak menaruh beberapa syarat untuk Anda?
Seperti ini, Anda berhenti ketika Anda mau
Dalam kasus saya, menggunakan Typescript, kita dapat menggunakan beberapa () yang melewati array dan berhenti ketika kondisi terpenuhi Jadi kode saya menjadi seperti ini:
Seperti ini, loop berhenti tepat setelah kondisi terpenuhi
Pengingat: Kode ini dijalankan dalam TypeScript
sumber
sumber
cara terbaik adalah -
1) Urutkan kedua array yang digunakan di loop pertama dan kedua.
2) jika item cocok maka pecahkan loop dalam dan tahan nilai indeks.
3) ketika mulai iterasi berikutnya mulai loop dalam dengan nilai indeks tahan.
sumber