Sirkuit pendek Array.forEach seperti memanggil istirahat
[1,2,3].forEach(function(el) {
if(el === 1) break;
});
Bagaimana saya bisa melakukan ini menggunakan baru forEach
metode dalam JavaScript? I've mencoba kembali;
, return false;
dan istirahat
. istirahat
crash dan kembali
tidak apa-apa tapi terus iterasi.
1416
29
Ada's tidak ada built-in kemampuan untuk
istirahat
diforEach
. Untuk mengganggu eksekusi anda akan memiliki untuk melemparkan pengecualian dari beberapa macam. misalnya.JavaScript pengecualian aren't sangat cantik. Tradisional
untuk
loop mungkin akan lebih tepat jika anda benar-benar perlu untukistirahat
di dalamnya.Gunakan
Array#beberapa
Sebaliknya, gunakan
Array#beberapa
:Ini bekerja karena
beberapa
mengembalikantrue
secepat apapun dari callback, yang dilaksanakan di hotel order, kembalibenar
, hubungan arus pendek eksekusi sisanya.beberapa
, yang inverssetiap
(yang akan berhenti padareturn false
), danforEach
semua ECMAScript Edisi Kelima metode yang akan perlu untuk ditambahkan keArray.prototipe
pada browser mana mereka're hilang.Sekarang ada cara yang lebih baik untuk melakukan hal ini di ECMAScript2015 (alias ES6) menggunakan untuk loop. Misalnya, kode ini tidak mencetak elemen array setelah nomor 5:
Dari docs:
Perlu indeks dalam iterasi? Anda dapat menggunakan
Array.entri()
:Anda dapat menggunakan setiap metode:
ES6
untuk browser lama mendukung penggunaan:
rincian lebih lanjut di sini.
Mengutip dari MDN dokumentasi
Array.prototype.forEach()
:Untuk kode anda (pertanyaan), seperti yang disarankan oleh @bobince, menggunakan
Array.prototype.some()
sebagai gantinya. Cocok sangat baik untuk anda usecase.Sayangnya dalam hal ini akan jauh lebih baik jika anda don't menggunakan
forEach
. Bukannya menggunakan regularuntuk
loop dan sekarang akan bekerja persis seperti yang anda harapkan.Pertimbangkan untuk menggunakan
jquery
'smasing-masing
metode, karena memungkinkan untuk kembali palsu dalam fungsi callback:Lodash perpustakaan juga menyediakan
takeWhile
metode yang dapat dirantai dengan peta/mengurangi/lipat dll:Dari contoh kode, sepertinya
Array.prototipe.menemukan
adalah apa yang anda cari adalah: Array.prototipe.menemukan() dan Array.prototipe.findIndex()Jika anda ingin menggunakan Dean Edward's saran dan membuang StopIteration kesalahan untuk keluar dari loop tanpa harus menangkap kesalahan, anda dapat menggunakan berikut fungsi (awalnya dari sini):
Kode di atas akan memberikan anda kemampuan untuk menjalankan kode seperti berikut tanpa harus melakukan anda sendiri try-catch klausa:
Salah satu hal yang penting untuk diingat adalah bahwa ini hanya akan update Array.prototipe.forEach fungsi jika sudah ada. Jika itu doesn't sudah ada, itu tidak akan mengubah itu.
Jawaban singkat: gunakan
untuk...istirahat
untuk ini atau mengubah kode anda untuk menghindari melanggarforEach
. Jangan gunakan.beberapa()
atau.setiap()
meniruuntuk...istirahat
. Menulis ulang kode untuk menghindariuntuk...istirahat
loop, atau menggunakanuntuk...istirahat
. Setiap kali anda menggunakan metode ini sebagaiuntuk...istirahat
alternatif Allah membunuh anak kucing.Jawaban panjang:
.beberapa()
dan.setiap()
kembaliboolean
nilai.beberapa()
mengembalikantrue
jika ada elemen yang berlalu fungsi mengembalikantrue
, setiap kembalipalsu
jika ada elemen yang berlalu kembali fungsipalsu
. Ini adalah apa itu fungsi yang berarti. Menggunakan fungsi-fungsi untuk apa yang mereka doesn't maksud adalah jauh lebih buruk kemudian menggunakan tabel untuk layout bukannya CSS, karena sepertinya semua orang yang membaca kode anda.Juga, satu-satunya cara yang mungkin untuk menggunakan metode ini sebagai
untuk...istirahat
alternatif adalah untuk membuat efek-samping (mengubah beberapa vars luar.beberapa()
fungsi callback), dan hal ini tidak jauh berbeda dariuntuk...istirahat
.Jadi, dengan menggunakan
.beberapa()
atau.setiap()
sebagaiuntuk...istirahat
loop alternatif isn't bebas dari efek samping, ini isn't jauh lebih bersih kemudianuntuk...istirahat
, ini adalah frustasi, jadi ini isn't lebih baik.Anda selalu dapat menulis ulang kode anda sehingga tidak akan ada perlu di
untuk...istirahat
. Anda dapat menyaring menggunakan array.filter()
, anda dapat membagi array menggunakan.slice()
dan sebagainya, maka gunakan.forEach()
atau.peta()
untuk itu bagian dari array.Ditemukan solusi ini pada situs lain. Anda dapat membungkus forEach di coba / tangkap skenario.
Rincian lebih lanjut di sini: http://dean.edwards.name/weblog/2006/07/enum/
Ini hanya sesuatu yang saya datang dengan untuk memecahkan masalah... saya'm cukup yakin ini perbaikan masalah yang asli penanya telah:
Konsep lain yang saya datang dengan:
Jika anda don't perlu untuk mengakses array setelah iterasi anda dapat bail out oleh pengaturan array's suhu udara turun menjadi 0. Jika anda masih membutuhkannya setelah iterasi anda bisa clone menggunakan slice..
Atau dengan clone:
Yang merupakan solusi yang jauh lebih baik kemudian melemparkan kesalahan acak dalam kode anda.
Ini adalah untuk loop, tapi mempertahankan referensi objek dalam lingkaran seperti forEach() tapi anda bisa keluar.
Seperti disebutkan sebelumnya, anda dapat't break
.forEach()
.Berikut ini's yang sedikit lebih modern cara melakukan foreach dengan ES6 Iterator. Memungkinkan anda untuk mendapatkan akses langsung ke
index
/nilai
ketika iterasi.Output:
Link
Array.prototype.entries()
Saya menggunakan nullhack untuk tujuan itu, ia mencoba untuk mengakses properti dari
nol
, yang merupakan kesalahan:Aku tahu itu bukan cara yang tepat. Hal ini tidak mematahkan lingkaran. Ini adalah Jugad
Jika anda ingin menyimpan
forEach
sintaks, ini adalah cara untuk tetap efisien (meskipun tidak sebagus biasa untuk loop). Cek segera untuk variabel yang tahu jika anda ingin keluar dari loop.Contoh ini menggunakan fungsi anonim untuk menciptakan ruang lingkup fungsi sekitar
forEach
yang anda butuhkan untuk menyimpan melakukan informasi.Saya dua sen.
Namun pendekatan lain
Gunakan
array.prototipe.setiap
fungsi, yang menyediakan utilitas untuk memecahkan perulangan. Lihat contoh berikut ini Javascript dokumentasi di Mozilla developer network