Cara membuat array asosiatif dalam Javascript. JQuery - Enumerate Array, Object dan Item Definisi dan Aplikasi

  • I. Otak mesin saat ini
    1. Metode foreach dan metode terkait
    2. Siklus untuk
    3. Penggunaan siklus untuk ... di
    4. Siklus untuk ... dari (penggunaan Iterator implisit)
    5. Penggunaan Iterator Eksplisit
    1. Menggunakan metode untuk memadamkan array nyata
    2. Transformasi menjadi array nyata
    3. Catatan tentang objek

I. Otak mesin saat ini

Saat ini ada tiga cara menghilangkan elemen array nyata:
  1. array.prototype.foreach metode;
  2. siklus klasik untuk;
  3. "Benar" membangun siklus untuk ... di.
Selain itu, segera, dengan munculnya standar ECMAScript 6 baru (ES 6), dua cara lagi diharapkan:
  1. siklus untuk ... dari (penggunaan Iterator implisit);
  2. penggunaan eksplisit dari iterator.

1. Metode foreach dan metode terkait

Jika proyek Anda dirancang untuk mendukung standar ECMAScript 5 (ES5), Anda dapat menggunakan salah satu metode inovasinya - foreach.

Contoh penggunaan:
var A \u003d ["A", "B", "C"]; a.Foreach (konsol.log (entri);));
Secara umum, penggunaan foreach memerlukan perpustakaan emulasi ES5-shim untuk browser yang tidak memiliki dukungan asli untuk metode ini. Ini termasuk IE 8 dan versi sebelumnya yang masih digunakan di beberapa tempat.

Keuntungan dari foreach adalah miliknya tidak perlu mendeklarasikan variabel lokal untuk menyimpan indeks dan nilai elemen array saat ini, karena mereka secara otomatis ditransmisikan ke fungsi panggilan balik (kolom) sebagai argumen.

Jika Anda khawatir tentang kemungkinan biaya panggilan Columus untuk setiap elemen, jangan khawatir dan membacanya.

Foreach dirancang untuk menikmati semua elemen array, tetapi selain itu, ES5 menawarkan beberapa metode yang lebih berguna untuk patung semua atau elemen tertentu ditambah pertunjukan dengan mereka:

  • setiap - mengembalikan true jika untuk setiap elemen array columus mengembalikan nilai yang diberikan kepada benar.
  • beberapa - mengembalikan BENAR, jika setidaknya untuk satu elemen array columus mengembalikan nilai yang diberikan kepada true.
  • filter - Membuat array baru, termasuk elemen-elemen dari array sumber yang mana kolom mengembalikan true.
  • peta - Membuat array baru yang terdiri dari nilai-nilai kolom cabul.
  • kurangi - Mengurangi array ke nilai tunggal dengan menerapkan colum secara bergantian ke setiap elemen array, mulai dari yang pertama (dapat berguna untuk menghitung jumlah elemen array dan fungsi hasil lainnya).
  • reducight - Bekerja sama untuk mengurangi, tetapi memindahkan item dalam urutan terbalik.

2. Siklus untuk

Bagus untuk kemudi:

Var A \u003d ["A", "B", "C"]; Indeks var; Untuk (indeks \u003d 0; indeks< a.length; ++index) { console.log(a); }
Jika panjang array tidak berubah selama seluruh siklus, dan siklus itu sendiri milik produktivitas kode (yang tidak mungkin), maka Anda dapat menggunakan versi "lebih optimal" untuk penyimpanan panjang array:

Var A \u003d ["A", "B", "C"]; Var index, len; untuk (indeks \u003d 0, len \u003d a.length; indeks< len; ++index) { console.log(a); }
Secara teoritis, kode ini harus dilakukan sedikit lebih cepat dari yang sebelumnya.

Jika prosedur untuk bore elemen tidak penting, maka Anda dapat melangkah lebih jauh dalam hal optimasi dan menyingkirkan variabel untuk menyimpan panjang array dengan mengubah prosedur untuk kebalikannya:

Var A \u003d ["A", "B", "C"]; Indeks var; untuk (indeks \u003d a.length - 1; index\u003e \u003d 0; --index) (konsol.log (a);)
Namun, dalam mesin JavaScript modern, permainan seperti itu dengan optimasi biasanya tidak berarti apa-apa.

3. Penggunaan siklus yang tepat untuk ... di

Jika Anda menyarankan Anda untuk menggunakan ... dalam siklus, ingatlah bahwa enumerasi array bukan untuk apa yang dimaksudkan. Bertentangan dengan siklus kesalahpahaman umum untuk ... di dalamnya bukan indeks array, tetapi sifat-sifat objek yang tercantum.

Namun demikian, dalam beberapa kasus, seperti busting array jarang, untuk ... pada mungkin berguna jika hanya tindakan pencegahan yang diikuti seperti yang ditunjukkan pada contoh di bawah ini:

// A - Raised array var a \u003d; A \u003d "A"; A \u003d "B"; A \u003d "C"; Untuk (kunci var dalam a) (jika (a.hasownproperty (kunci) && / \u003d $$ | ^ md * $ /. Tes (kunci) && kunci<= 4294967294) { console.log(a); } }
Dalam contoh ini, dua cek dilakukan pada setiap iterasi siklus:

  1. fakta bahwa array memiliki properti sendiri dengan nama nama (tidak diwarisi dari prototipe).
  2. fakta bahwa kunci adalah string yang berisi catatan desimal integer yang nilainya kurang dari 4294967294. Dari mana asal nomor terakhir? Dari definisi indeks array di ES5, dari mana ia mengikuti bahwa indeks terbesar yang dapat memiliki elemen dalam array: (2 ^ 32 - 2) \u003d 4294967294.
Tentu saja, pemeriksaan seperti itu akan membutuhkan waktu ekstra ketika siklus dijalankan. Tetapi dalam kasus array yang jarang terjadi, metode ini lebih efisien daripada untuk siklus, karena dalam hal ini hanya elemen-elemen yang didefinisikan dengan jelas dalam array. Jadi, dalam contoh di atas, hanya 3 iterasi yang akan dilakukan (untuk indeks 0, 10 dan 10.000) - terhadap 10001 dalam siklus.

Agar tidak menulis kode pemeriksaan besar seperti itu setiap kali massif diperlukan, adalah mungkin untuk mengaturnya sebagai fungsi terpisah:

Fungsi arrayhasownindex (array, kunci) (return array.hasownproperty (kunci) && / \u003d ketik $ | ^ md * $ /. Uji (kunci) &&<= 4294967294; }
Kemudian tubuh siklus dari contoh akan secara signifikan berkurang:

Untuk (jika (arraysownindex (a, kunci)) (konsol.log (a);)))
Kode audit yang dibahas di atas adalah universal yang cocok untuk semua kasus. Tetapi sebaliknya Anda dapat menggunakan versi yang lebih pendek, meskipun secara formal dan tidak cukup benar, tetapi, bagaimanapun, cocok untuk sebagian besar kasus:

Untuk (i.hasownproperty (kunci) && string (parseint (kunci, 10)) \u003d\u003d\u003d kunci) (konsol.log (a))))

4. Siklus untuk ... dari (Penggunaan Iterator Tersirat)

ES6, sementara masih dalam status draft, harus memasukkan iterator dalam javascript.

Iterator. - Ini adalah protokol yang diterapkan oleh objek yang menentukan metode standar untuk mendapatkan urutan nilai (terbatas atau tak terbatas).
Iterator adalah objek di mana metode berikutnya () didefinisikan - fungsi tanpa argumen yang mengembalikan objek dengan dua properti:

  1. selesai (Boolean) - dibutuhkan benar jika iterator mencapai akhir urutan yang dihasilkan. Jika tidak, memiliki nilai palsu.
  2. nilai - menentukan nilai yang dikembalikan oleh iterator. Ini mungkin tidak didefinisikan (tidak ada) jika properti yang dilakukan itu benar.
Banyak benda bawaan, termasuk. Array ini, memiliki iterator default. Cara paling sederhana untuk menggunakan iterator dalam array nyata adalah dengan menggunakan yang baru untuk ... dari.

Contoh penggunaan untuk ... dari:

Var val; var A \u003d ["A", "B", "C"]; Untuk (val a) (konsol.log (val);)
Dalam contoh di atas, untuk ... secara implisit menyebutnya objek array iterator untuk mendapatkan setiap nilai array.

5. Penggunaan Iterator secara eksplisit

Iterator juga dapat digunakan dan secara eksplisit, bagaimanapun, dalam hal ini kode menjadi jauh lebih rumit, dibandingkan dengan untuk ... dari siklus. Sepertinya ini:

Var A \u003d ["A", "B", "C"]; var it \u003d a.entries (); Entri var; Sementara (! (Entry \u003d it.next ()). Selesai) (konsol.log (entry.value);)
Dalam contoh ini, array.prototype.entries mengembalikan iterator yang digunakan untuk menampilkan nilai array. Setiap entri iterasi. Value berisi array formulir [Kunci, Nilai].

Ii. Patung benda seperti masif

Selain array nyata, Javascript juga ditemukan benda-benda seperti masif . Dengan array nyata, kerabat mereka terkait dengan fakta bahwa mereka memiliki properti panjang dan sifat dengan nama dalam bentuk angka yang sesuai dengan elemen array. Anda dapat menghubungi koleksi Nodelis Dom dan argumen pseudomassif yang tersedia di dalam fungsi / metode apa pun.

1. Menggunakan cara memadamkan array nyata

Setidaknya sebagian besar, jika tidak semua, metode pemadaman array nyata dapat diterapkan untuk menghitung benda-benda seperti besar.

Desain untuk dan untuk ... di dapat diterapkan untuk secara masif seperti objek dengan cara yang persis sama dengan array nyata.

Foreach dan array lain.prototipe Metode juga berlaku untuk benda besar. Untuk melakukan ini, gunakan file. Call atau Function. Terapkan panggilan.

Misalnya, jika Anda ingin menerapkan foreach ke properti node objek childnodes, maka ini dilakukan seperti ini:

Array.prototype.foreach.call (node.childnodes, fungsi (anak) (// buat apa pun dengan objek anak));
Untuk kemudahan penggunaan kembali penerimaan ini, Anda dapat mendeklarasikan tautan ke array.prototype.Foreach metode dalam variabel terpisah dan menggunakannya sebagai pengurangan:

// (diasumsikan bahwa semua kode di bawah ini dalam satu bidang visibilitas) var foreach \u003d array.prototype.foreach; // ... foreach.call (node.childnodes, fungsi (anak) (// buat sesuatu dengan objek anak));
Jika objek seperti array adalah iterator, itu dapat digunakan secara eksplisit atau implisit untuk integritas objek dengan cara yang sama seperti untuk array nyata.

2. Konversi ke array ini

Ada juga yang lain, sangat sederhana, cara untuk menghitung objek seperti lengan: mengubahnya menjadi array nyata dan menggunakan salah satu metode array yang ada yang dibahas di atas. Untuk konversi, Anda dapat menggunakan metode universal array.prototype.slice, yang dapat diterapkan ke objek besar. Ini dilakukan dengan sangat sederhana seperti yang ditunjukkan pada contoh di bawah ini:

Var trueArray \u003d array.protype.slice.call (arraylikecject, 0);
Misalnya, jika Anda ingin mengonversi koleksi nodel ke array nyata, Anda perlu kode seperti itu:

Var divs \u003d array.prototype.slice.call (document.queryselectoread ("div"), 0);
Memperbarui.: Seperti dicatat dalam komentar rock and torbasow, di ES6 bukan array.prototype.slice, Anda dapat menggunakan metode array yang lebih visual.

3. Catatan tentang objek lingkungan eksekusi

Jika Anda menerapkan metode array.prototipe ke objek lingkungan eksekusi (seperti koleksi DOM), maka Anda harus ingat bahwa operasi yang benar dari metode ini tidak dijamin di semua lingkungan eksekusi (termasuk di browser). Itu tergantung pada perilaku objek tertentu dalam lingkungan olahraga tertentu, jika lebih tepatnya, dari cara operasi hasproperty abstrak diimplementasikan dalam objek ini. Masalahnya adalah bahwa standar ES5 itu sendiri memungkinkan kemungkinan perilaku objek yang salah sehubungan dengan operasi ini (lihat §8.6.2).

Oleh karena itu, penting untuk menguji pekerjaan array.prototipe metode di setiap lingkungan eksekusi (browser), di mana Anda berencana untuk menggunakan aplikasi Anda.

  • I. Otak mesin saat ini
    1. Metode foreach dan metode terkait
    2. Siklus untuk
    3. Penggunaan siklus untuk ... di
    4. Siklus untuk ... dari (penggunaan Iterator implisit)
    5. Penggunaan Iterator Eksplisit
  • Ii. Patung benda seperti masif
    1. Menggunakan metode untuk memadamkan array nyata
    2. Transformasi menjadi array nyata
    3. Catatan tentang objek

I. Otak mesin saat ini

Saat ini ada tiga cara menghilangkan elemen array nyata:

  1. array.prototype.foreach metode;
  2. siklus klasik untuk;
  3. "Benar" membangun siklus untuk ... di.

Selain itu, segera, dengan munculnya standar ECMAScript 6 baru (ES 6), dua cara lagi diharapkan:

  1. siklus untuk ... dari (penggunaan Iterator implisit);
  2. penggunaan eksplisit dari iterator.

1. Metode foreach dan metode terkait

Jika proyek Anda dirancang untuk mendukung standar ECMAScript 5 (ES5), Anda dapat menggunakan salah satu metode inovasinya - foreach.

Contoh penggunaan:

Var A \u003d ["A", "B", "C"]; a.Foreach (konsol.log (entri);));

Secara umum, penggunaan foreach memerlukan perpustakaan emulasi ES5-shim untuk browser yang tidak memiliki dukungan asli untuk metode ini. Ini termasuk IE 8 dan versi sebelumnya yang masih digunakan di beberapa tempat.

Keuntungan dari foreach adalah miliknya tidak perlu mendeklarasikan variabel lokal untuk menyimpan indeks dan nilai elemen array saat ini, karena mereka secara otomatis ditransmisikan ke fungsi panggilan balik (kolom) sebagai argumen.

Jika Anda khawatir tentang kemungkinan biaya panggilan Columus untuk setiap elemen, jangan khawatir dan membacanya.

foreach dirancang untuk menikmati semua elemen array, tetapi selain itu, ES5 menawarkan beberapa metode yang lebih berguna untuk patung semua atau elemen tertentu ditambah pertunjukan dengan mereka:

  • setiap - mengembalikan true jika untuk setiap elemen array columus mengembalikan nilai yang diberikan kepada benar.
  • beberapa - mengembalikan BENAR, jika setidaknya untuk satu elemen array columus mengembalikan nilai yang diberikan kepada true.
  • filter - Membuat array baru, termasuk elemen-elemen dari array sumber yang mana kolom mengembalikan true.
  • peta - Membuat array baru yang terdiri dari nilai-nilai kolom cabul.
  • kurangi - Mengurangi array ke nilai tunggal dengan menerapkan colum secara bergantian ke setiap elemen array, mulai dari yang pertama (dapat berguna untuk menghitung jumlah elemen array dan fungsi hasil lainnya).
  • reducight - Bekerja sama untuk mengurangi, tetapi memindahkan item dalam urutan terbalik.

2. Siklus untuk

Bagus untuk kemudi:

Var A \u003d ["A", "B", "C"]; Indeks var; Untuk (indeks \u003d 0; indeks< a.length; ++index) { console.log(a); }

Jika panjang array tidak berubah selama seluruh siklus, dan siklus itu sendiri milik produktivitas kode (yang tidak mungkin), maka Anda dapat menggunakan versi "lebih optimal" untuk penyimpanan panjang array:

Var A \u003d ["A", "B", "C"]; Var index, len; untuk (indeks \u003d 0, len \u003d a.length; indeks< len; ++index) { console.log(a); }

Secara teoritis, kode ini harus dilakukan sedikit lebih cepat dari yang sebelumnya.

Jika prosedur untuk bore elemen tidak penting, maka Anda dapat melangkah lebih jauh dalam hal optimasi dan menyingkirkan variabel untuk menyimpan panjang array dengan mengubah prosedur untuk kebalikannya:

Var A \u003d ["A", "B", "C"]; Indeks var; untuk (indeks \u003d a.length - 1; index\u003e \u003d 0; --index) (konsol.log (a);)

Namun, dalam mesin JavaScript modern, permainan seperti itu dengan optimasi biasanya tidak berarti apa-apa.

3. Penggunaan siklus yang tepat untuk ... di

Jika Anda menyarankan Anda untuk menggunakan ... dalam siklus, ingatlah bahwa enumerasi array bukan untuk apa yang dimaksudkan. Bertentangan dengan siklus kesalahpahaman umum untuk ... di dalamnya bukan indeks array, tetapi sifat-sifat objek yang tercantum.

Namun demikian, dalam beberapa kasus, seperti busting array jarang, untuk ... pada mungkin berguna jika hanya tindakan pencegahan yang diikuti seperti yang ditunjukkan pada contoh di bawah ini:

// A - Raised array var a \u003d; A \u003d "A"; A \u003d "B"; A \u003d "C"; Untuk (kunci var dalam a) (jika (a.hasownproperty (kunci) && / \u003d $$$$$ /. Tes (kunci) && kunci<= 4294967294) { console.log(a); } }

Dalam contoh ini, dua cek dilakukan pada setiap iterasi siklus:

  1. fakta bahwa array memiliki properti sendiri dengan nama nama (tidak diwarisi dari prototipe).
  2. fakta bahwa kunci adalah string yang berisi catatan desimal integer yang nilainya kurang dari 4294967294. Dari mana asal nomor terakhir? Dari definisi indeks array di ES5, dari mana ia mengikuti bahwa indeks terbesar yang dapat memiliki elemen dalam array: (2 ^ 32 - 2) \u003d 4294967294.

Tentu saja, pemeriksaan seperti itu akan membutuhkan waktu ekstra ketika siklus dijalankan. Tetapi dalam kasus array yang jarang terjadi, metode ini lebih efisien daripada untuk siklus, karena dalam hal ini hanya elemen-elemen yang didefinisikan dengan jelas dalam array. Jadi, dalam contoh di atas, hanya 3 iterasi yang akan dilakukan (untuk indeks 0, 10 dan 10.000) - terhadap 10001 dalam siklus.

Agar tidak menulis kode pemeriksaan besar seperti itu setiap kali massif diperlukan, adalah mungkin untuk mengaturnya sebagai fungsi terpisah:

Fungsi arrayhasownindex (array, kunci) (pengembalian array.hasownproperty (kunci) && / / / / / / / //// kunci<= 4294967294; }

Kemudian tubuh siklus dari contoh akan secara signifikan berkurang:

Untuk (jika (arraysownindex (a, kunci)) (konsol.log (a);)))

Kode audit yang dibahas di atas adalah universal yang cocok untuk semua kasus. Tetapi sebaliknya Anda dapat menggunakan versi yang lebih pendek, meskipun secara formal dan tidak cukup benar, tetapi, bagaimanapun, cocok untuk sebagian besar kasus:

Untuk (i.hasownproperty (kunci) && string (parseint (kunci, 10)) \u003d\u003d\u003d kunci) (konsol.log (a))))

4. Siklus untuk ... dari (Penggunaan Iterator Tersirat)

ES6, sementara masih dalam status draft, harus memasukkan iterator dalam javascript.

Iterator. - Ini adalah protokol yang diterapkan oleh objek yang menentukan metode standar untuk mendapatkan urutan nilai (terbatas atau tak terbatas).
Objek memiliki iterator jika mendefinisikan metode berikutnya () - fungsi tanpa argumen, yang mengembalikan objek dengan dua properti:

  1. selesai (Boolean) - dibutuhkan benar jika iterator mencapai akhir urutan yang dihasilkan. Jika tidak, memiliki nilai palsu.
  2. nilai - menentukan nilai yang dikembalikan oleh iterator. Ini mungkin tidak didefinisikan (tidak ada) jika properti yang dilakukan itu benar.

Banyak benda bawaan, termasuk. Array ini, memiliki iterator default. Cara paling sederhana untuk menggunakan iterator dalam array nyata adalah dengan menggunakan yang baru untuk ... dari.

Contoh penggunaan untuk ... dari:

Var val; var A \u003d ["A", "B", "C"]; Untuk (val a) (konsol.log (val);)

Dalam contoh di atas, untuk ... secara implisit menyebutnya objek array iterator untuk mendapatkan setiap nilai array.

5. Penggunaan Iterator secara eksplisit

Iterator juga dapat digunakan dan secara eksplisit, bagaimanapun, dalam hal ini kode menjadi jauh lebih rumit, dibandingkan dengan untuk ... dari siklus. Sepertinya ini:

Var A \u003d ["A", "B", "C"]; Entri var; Sementara (! (Entry \u003d a.next ()). Selesai) (konsol.log (entry.value);)

Ii. Patung benda seperti masif

Selain array nyata, Javascript juga ditemukan benda-benda seperti masif . Dengan array nyata, kerabat mereka terkait dengan fakta bahwa mereka memiliki properti panjang dan sifat dengan nama dalam bentuk angka yang sesuai dengan elemen array. Anda dapat menghubungi koleksi Nodelis Dom dan argumen pseudomassif yang tersedia di dalam fungsi / metode apa pun.

1. Menggunakan cara memadamkan array nyata

Setidaknya sebagian besar, jika tidak semua, metode pemadaman array nyata dapat diterapkan untuk menghitung benda-benda seperti besar.

Desain untuk dan untuk ... di dapat diterapkan untuk secara masif seperti objek dengan cara yang persis sama dengan array nyata.

foreach dan array lain.prototipe Metode juga berlaku untuk benda besar. Untuk melakukan ini, gunakan file. Call atau Function. Terapkan panggilan.

Misalnya, jika Anda ingin menerapkan foreach ke properti node objek childnodes, maka ini dilakukan seperti ini:

Array.prototype.foreach.call (node.childnodes, fungsi (anak) (// buat apa pun dengan objek anak));

Untuk kemudahan penggunaan kembali penerimaan ini, Anda dapat mendeklarasikan tautan ke array.prototype.Foreach metode dalam variabel terpisah dan menggunakannya sebagai pengurangan:

// (diasumsikan bahwa semua kode di bawah ini dalam satu bidang visibilitas) var foreach \u003d array.prototype.foreach; // ... foreach.call (node.childnodes, fungsi (anak) (// buat sesuatu dengan objek anak));

Jika objek seperti array adalah iterator, itu dapat digunakan secara eksplisit atau implisit untuk integritas objek dengan cara yang sama seperti untuk array nyata.

2. Konversi ke array ini

Ada juga yang lain, sangat sederhana, cara untuk menghitung objek seperti lengan: mengubahnya menjadi array nyata dan menggunakan salah satu metode array yang ada yang dibahas di atas. Untuk konversi, Anda dapat menggunakan metode universal array.prototype.slice, yang dapat diterapkan ke objek besar. Ini dilakukan dengan sangat sederhana seperti yang ditunjukkan pada contoh di bawah ini:

Var trueArray \u003d array.protype.slice.call (arraylikecject, 0);

Misalnya, jika Anda ingin mengonversi koleksi nodel ke array nyata, Anda perlu kode seperti itu:

Var divs \u003d array.prototype.slice.call (document.queryselectoread ("div"), 0);

3. Catatan tentang objek lingkungan eksekusi

Jika Anda menerapkan metode array.prototipe ke objek lingkungan eksekusi (seperti koleksi DOM), maka Anda harus ingat bahwa operasi yang benar dari metode ini tidak dijamin di semua lingkungan eksekusi (termasuk di browser). Itu tergantung pada perilaku objek tertentu dalam lingkungan olahraga tertentu, jika lebih tepatnya, dari cara operasi hasproperty abstrak diimplementasikan dalam objek ini. Masalahnya adalah bahwa standar ES5 itu sendiri memungkinkan kemungkinan perilaku objek yang salah sehubungan dengan operasi ini (lihat §8.6.2).

Oleh karena itu, penting untuk menguji pekerjaan array.prototipe metode di setiap lingkungan eksekusi (browser), di mana Anda berencana untuk menggunakan aplikasi Anda.

Mereka untuk setiap () Metode mengeksekusi fungsi yang disediakan satu kali untuk setiap elemen array.

Sumber untuk contoh interaktif ini disimpan dalam repositori GitHub. Jika Anda ingin berkontribusi pada proyek contoh interaktif, silakan klon https://github.com/mdn/interactive-examples dan kirimkan permintaan tarik kami.

Sintaksis

Arr.foreach (panggilan balik (CurrentValue [, indeks [, array]]) [, thisarg])

Parameter.

Fungsi panggilan balik untuk dieksekusi pada setiap elemen. Ini menerima antara satu dan tiga argumen: CurrentValue elemen saat ini sedang diproses dalam array. Indeks opsional value indeks dalam array. Array opsional array foreach () dipanggil. Nilai opsional ini untuk digunakan saat ini saat mengeksekusi panggilan balik.

Nilai kembali.

Deskripsi.

foreach () memanggil fungsi panggilan balik yang disediakan satu kali untuk setiap elemen dalam array dalam urutan menaik. Ini tidak dipanggil untuk properti indeks yang telah dihapus atau tidak diinisialisasi. Untuk array jarang,)

panggilan balik dipanggil dengan tiga argumen:

  1. nilai elemen
  2. indeks elemen
  3. objek array melintasi

Jika parameter thisarg disediakan untuk foreach (), itu akan digunakan sebagai nilai panggilan balik ini. Nilai terpana yang dapat diamati dengan panggilan balik ditentukan sesuai dengan aturan yang dilihat oleh fungsi ini.

Kisaran elemen yang diproses oleh forach () diatur sebelum doa pertama panggilan balik. Elemen yang ditambahkan ke array setelah panggilan ke Foreach () dimulai tidak akan dikunjungi dengan panggilan balik. Jika elemen array yang ada diubah atau dihapus, nilainya seperti yang diteruskan ke panggilan balik akan menjadi nilai pada waktu FORACH () mengunjungi mereka; Elemen yang dihapus sebelum dikunjungi tidak dikunjungi. Jika elemen yang sudah dikunjungi dihapus (mis. Menggunakan Shift ()) selama iterasi, elemen selanjutnya akan dilewati. (Lihat contoh ini, di bawah ini.)

foreach () mengeksekusi fungsi panggilan balik sekali untuk setiap elemen array; Tidak seperti Peta () atau kurangi () Selalu mengembalikan nilai yang tidak ditentukan dan tidak rantai. Kasus penggunaan khas adalah untuk mengeksekusi efek samping di ujung rantai.

foreach () tidak bermutasi array di mana itu disebut. (Namun, panggilan balik dapat melakukannya)

Tidak ada cara untuk menghentikan atau mematahkan loop foreach () selain selema dengan melempar pengecualian. Jika Anda memerlukan perilaku seperti itu, metode foreach () adalah alat yang salah.

Pengakhiran dini dapat dilakukan dengan:

Metode array: Setiap (), beberapa (), temukan (), dan findIndex () Uji elemen array dengan predikat mengembalikan nilai yang tepat untuk menentukan apakah iterasi lebih lanjut diperlukan.

Contoh.

Tidak ada operasi untuk nilai-nilai yang belum diinisialisasi (array jarang)

Constparse \u003d biarkan numcallbackruns \u003d 0 arraysparase.foreach (elemen (elemen) (elemen)) konsol.log ("numcallbackruns:", numcallbackruns) //// 7 // numcallbackruns: 3 // komentar : Karena Anda dapat melihat nilai yang hilang antara 3 dan 7 tidak menjalankan fungsi panggilan balik.

Mengkonversi a untuk loop ke foreach

const item \u003d ["item1", "item2", "item3"] const copy \u003d // sebelum untuk (biarkan i \u003d 0; i< items.length; i++) { copy.push(items[i]) } // after items.forEach(function(item){ copy.push(item) })

Mencetak isi array

catatan: Untuk menampilkan konten array di konsol, Anda dapat menggunakan konsol.table (), yang mencetak versi array yang diformat.

Contoh berikut menggambarkan pendekatan alternatif, menggunakan foreach ().

Kode berikut ini mencatat garis untuk setiap elemen dalam array:

Fungsi logarrayelements (elemen, indeks, array) (konsol.log ("a [" + index + "] \u003d" elemen +) // perhatikan bahwa indeks 2 dilewati, karena tidak ada item di // posisi itu di // Array ....Foreach (logarrayelements) // log: // A \u003d 2 // A \u003d 5 // A \u003d 9

Menggunakan thisarg.

Contoh berikut (contred) memperbarui properti objek dari setiap entri dalam array:

Fungsi counter () (ini.sum \u003d 0) counter.prototype.add \u003d fungsi (array) (array.fourneach (fungsi (entri), ini ) // ^ ---- Catatan) Const OBJ \u003d NEW counter () obj.add () obj.count // 3 obj.sum // 16

Karena parameter ini (ini) disediakan untuk foreach (), ia diteruskan ke panggilan balik setiap kali itu dipanggil. Panggilan balik menggunakannya sebagai nilai ini.

Fungsi Salin Objek

Kode berikut membuat salinan objek yang diberikan.

Ada berbagai cara untuk membuat salinan objek. Berikut ini hanyalah satu cara dan hadir untuk menjelaskan bagaimana array.prototype.foreach () bekerja dengan menggunakan objek ECMAScript 5. * Fungsi properti Meta.

Fungsi Salin (OBJ) (Object.getPrototypeof (OBJ)) Const Propnames \u003d Object.getownPropertyNames (OBJ) Propname.ForEnt (Conf \u003d Object.getownPropertydescriptor (OBJ, NAME)) Kembalikan Salin (Salin, Nama))) ) Const OBJ1 \u003d (A: 1, B: 2) Const OBJ2 \u003d Salin (obj1) // obj2 terlihat seperti OBJ1 sekarang

Jika array dimodifikasi selama iterasi, elemen lain mungkin dilewati.

Contoh berikut log "satu", "dua", "empat".

Ketika entri berisi nilai "(! Lang: Dua" is reached, the first entry of the whole array is shifted off-resulting in all remaining entries moving up one position. Because element "four" is now at an earlier position in the array, "three" will be skipped.!}

foreach () tidak membuat salinan array sebelum iteating.

Biarkan kata-kata \u003d ["satu", "dua", "tiga", "empat"] kata-kata. Bertukeach (fungsi (kata) jika (kata \u003d\u003d\u003d "dua") (kata-kata ()))) // // dua empat

Ratakan array.

Contoh berikut ini hanya di sini untuk tujuan belajar. Jika Anda ingin meratakan array menggunakan metode bawaan Anda dapat menggunakan array.prototype.flat () (yang diharapkan menjadi bagian dari ES2019, dan Alady diimplementasikan di beberapa browser).

** * Flattens lulus array dalam array satu dimensi * * @params (array) arr * @returns (array) * / fungsi flatten (arr) (con const \u003d arr.foreach (i) \u003d\u003e (ifainray) (I)) (hasil.push (... ratakan (i))) Lain lain (hasil.push (i))) hasil pengembalian) // masalah const const \u003d, 8, 9]] Ratakan (masalah) / /

Catatan tentang Menggunakan Janji atau Fungsi Async

Biarkan peringkat \u003d biarkan Sum \u003d 0 Biarkan SumFungsi \u003d fungsi async (A, b) (mengembalikan A + b) peringkat // output yang diharapkan: 14 // output aktual: 0

Spesifikasi.

Spesifikasi Status. Komentar
Draf terbaru ECMAScript (ECMA-262)
MINUMAN.
ECMAScript 2015 (edisi ke-6, ECMA-262)
Definisi "array.prototipe.foreach" dalam spesifikasi itu.
Standar
ECMASCRUCT 5.1 (ECMA-262)
Definisi "array.prototipe.foreach" dalam spesifikasi itu.
Standar Definisi awal. Diimplementasikan dalam JavaScript 1.6.

Kompatibilitas browser

Tabel kompatibilitas di halaman ini dihasilkan dari data terstruktur. Jika Anda ingin berkontribusi pada data, silakan periksa https://github.com/mdn/browser-compat-data dan kirimkan permintaan tarik kami.

Perbarui data kompatibilitas pada GitHub

Desktop.Mobile.Server.
Chrome.Tepi.Firefox.Internet Explorer.Opera.Safari.Android WebView.Chrome untuk Android.Firefox untuk Android.Opera untuk Android.Safari di iOS.Samsung Internet.Node.js.
Untuk setiap.Dukungan penuh Chrome 1Dukungan penuh tepi 12Dukungan penuh Firefox 1.5IE dukungan penuh 9Opera Dukungan Penuh YaSafari dukungan penuh 3WebView Android dukungan penuh ≤37Dukungan penuh Chrome Android 18Dukungan penuh android firefox 4Opera android dukungan penuh yaSafari iOS Dukungan Penuh 1Samsung Internet Android Dukungan penuh 1.0nodejs dukungan penuh ya

Sebuah artikel di mana kami mempertimbangkan dengan contoh-contoh untuk menggunakan fungsi dan metode jQuery setiap perpustakaan.

Di perpustakaan jQuery ada 2 entitas berbeda dengan nama masing-masing.

Yang pertama (jQuery.Ensip) adalah fungsi jQuery universal yang dengannya Anda dapat membuat kekuatan brute dari array atau elemen objek.

Yang kedua (masing-masing) adalah metode yang berlaku untuk serangkaian elemen untuk mengatur siklus pada mereka.

Masing-masing (jQuery.imple) siklus. Contoh penggunaan

Fungsi sintaks masing-masing:

// Array atau Object - array atau objek, elemen atau sifat-sifat yang harus diselesaikan // panggil ulang - fungsi yang akan dilakukan untuk setiap elemen array atau objek properti $ .each (Array atau Object, Callback);

Bekerja dengan setiap fungsi akan melihat contoh.

Contoh nomor 1. Ini akan dilakukan oleh pelaku semua elemen array (array).

// array, terdiri dari 3 baris var arr \u003d ["mobil", "truk", "bus"]; // Setelah Arr $ .each array (ARR, FUNGSI (INDEX, VALUE) (// Tindakan yang akan dilakukan untuk setiap elemen dari array // Indeks - ini adalah indeks saat ini dari elemen array (nomor) // nilai adalah nilai elemen saat dari array // menarik indeks dan nilai array di konsol console.log ( "index:" + index + "; nilai:" + nilai);)); / * Hasil (konsol): Indeks: 0; Nilai: Indeks Mobil: 1; MAKNA: Indeks truk: 2; Nilai: Bus * /

Dalam kode di atas, setiap fungsi digunakan untuk menghitung array. Fungsinya memiliki 2 parameter wajib. Parameter pertama adalah esensi (array atau objek), elemen-elemen (properti) yang harus diurutkan. Dalam hal ini, ini adalah array panah. Parameter kedua adalah fungsi panggilan balik yang akan dilakukan untuk setiap elemen (dalam hal ini) array. Ini memiliki 2 parameter yang tersedia di dalamnya dengan variabel yang sesuai. Parameter pertama adalah urutan nomor elemen (hitungan mundur dilakukan dari 0). Parameter kedua adalah nilai dari elemen array saat ini.

Contoh nomor 2. Dalam contoh ini, kita akan ada semua sifat objek.


// Smartphone objek memiliki 5 VAR smartphone \u003d ( "Nama" sifat: "LG G5 SE", "TAHUN": "2016", "Screen-Size": "5.3", "Layar-Resolusi": "2560 x 1440" , "OS": "Android 6.0 (marshmallow)"); // setelah Anda dengan objek smartphone $ .each (smartphone, fungsi (kunci, nilai) (// tindakan yang akan dieksekusi untuk setiap objek properti // kunci - nama saat ini dari sifat-sifat array // nilai - the nilai properti objek saat // menarik nama properti dan nilainya di konsol console.log ( "properti:" + Key + "; nilai:" + nilai);)); / * Hasil (konsol): Properti: Nama; Nilai: LG G5 SE Properti: Tahun; Nilai: 2016 properti: ukuran layar; Nilai: 5.3 Properti: resolusi layar; Nilai: 2560 x 1440 properti: OS; MAKNA: Android 6.0 (marshmallow) * /

Setiap fungsi dapat digunakan untuk benda javascript yang ramai. Perbedaan antara penggunaannya hanya terdiri dari fakta bahwa parameter fungsi panggilan balik memiliki nilai lain. Parameter pertama menyimpan nama properti objek, dan yang kedua adalah nilai dari properti ini.

Contoh nomor 3. Di dalamnya, kita akan ada struktur yang lebih kompleks (pertimbangkan bagaimana menggunakan masing-masing bersarang).

// objek yang terdiri dari 2 properti. Setiap properti dari objek ini memiliki sebuah array sebagai nilai, unsur-unsur yang juga objek ARTIKEL VAR \u003d ( "Bootstrap": [( "ID": "1", "title": "Pendahuluan"), ( "ID" : "2", "Judul": "Cara Set"), ( "id": "3", "title": "Grid")], "javascript": [( "ID": "4", " title ": "Dasar "), (" ID ":" 5"," title ":" sampel elemen ")]); $ .each (console.log ( "bagian:" + Key); $ .each (Data, Fungsi (Index, Nilai) (console.log ( "Artikel: ID \u003d" + Nilai [ID "] +"; nama \u003d "+ nilai [" judul "]);));); / * Hasil: Bagian: Bootstrap Article: ID \u003d 1; Nama \u003d Pendahuluan Artikel: ID \u003d 2; Judul \u003d Cara Memasang Artikel: ID \u003d 3; Nama \u003d Mesh Bagian: Artikel JavaScript: ID \u003d 4; Nama \u003d dasar Artikel: ID \u003d 5; Nama \u003d Elemen Sampling * /

Bagaimana cara menyela (keluar dari siklus)?

Interupsi (istirahat) dari setiap siklus dilakukan dengan menggunakan pernyataan pengembalian, yang harus mengembalikan nilai FALSE.

Misalnya, kami menginterupsi eksekusi setiap siklus setelah menemukan nomor 7 di array:

// array yang terdiri dari 5 angka var arr \u003d; // nomor yang ingin Anda temukan var find \u003d 7; // Setelah Arr $ .each array (ARR, FUNGSI (Index, Nilai) (// Jika jumlah yang diperlukan ditemukan, maka .. jika (Nilai \u003d\u003d\u003d Cari) (// Hapus ke dalam konsol console.log ( "Hore jumlah! '+ Cari +: + index' Ditemukan jumlah ini memiliki indeks!"); // mengganggu siklus RETURN FALSE;) ELSE (// jika tidak, untuk menampilkan saat ini jumlah console.log ke konsol ( "jumlah sekarang:" + Nilai);))); / * Hasil (dalam konsol): Nomor Saat Ini: 5 Nomor Saat Ini: 4 Hore! Nomor 7 ditemukan! Nomor ini memiliki indeks: 2 * /

Bagaimana cara pergi ke iterasi berikutnya (masing-masing melanjutkan)?

Di masing-masing, gangguan iterasi saat ini dan transisi ke yang berikutnya dilakukan dengan menggunakan pernyataan pengembalian, yang harus memiliki nilai berbeda dari false.

// array yang terdiri dari var arr \u003d angka; // array yang harus berisi semua elemen array arrak, kecuali untuk nilai var yesuarr \u003d; // Setelah panah panah arr.each (Arr, Fungsi (Index, Nilai) (// jika diukur, maka Anda akan kehilangan itu jika (Nilai% 2 \u003d\u003d\u003d 0) (// culun LEBIH DARI SAAT YANG iterate DAN MACHE ATAS BERIKUTNYA RETURN;) // Tambah ke Array NewArr Nilai NEWARR.PUSH (VALUE);)); Konsol.log ("array sumber (arr):" + arr.join ()); Konsol.log ("array hasil (NewAr):" + Newarr.Join ()); / * Hasil (di konsol): Sumber array (ARR): 3,5,4,9,17,19,30,35,40 Hasil array (NewArr): 3,5,9,17,19,35 * /

Payudara elemen saat ini (.each)

Setiap sintaks metode (dipilih hanya untuk item yang dipilih):


.each (fungsi); // Fungsi - fungsi yang akan dilakukan untuk setiap item objek saat ini

Kami akan menganalisis bagaimana metode ini bekerja pada contoh berikut (dengan menumbuhkan elemen div):


Dalam contoh di atas, setiap metode menggunakan set arus (elemen yang dipilih oleh $ Selector ("Div"). Sebagai masing-masing metode handler, suatu fungsi selalu dilakukan, yang akan dilakukan untuk setiap elemen panggilan saat ini (dalam hal ini untuk setiap elemen div). Fungsi ini memiliki 2 parameter opsional. Salah satunya (indeks) adalah nomor urutan iterasi saat ini, dan referensi kedua (elemen) - DOM ke elemen saat ini. Selain itu, di dalam fungsi, kata kunci ini tersedia, yang serta parameter kedua berisi tautan DOM ke elemen saat ini.

Misalnya, tarik atribut href untuk semua item dan pada halaman ke konsol.

$ ("A"). Setiap (fungsi () (konsol.log ($ (ini) .attr ("href"));));

$ ( "A") Setiap (FUNGSI () (VAR link \u003d $ (ini) attr ( "href"); if ((link.indexof ( "http: //".) \u003d\u003d 0) || (Link .Indexof ("https: //") \u003d\u003d 0)) (konsol.log ("href referensi \u003d" + tautan);))); // Jika tautan berikut terletak di halaman: // yandex // Bagaimana javascript bekerja? // bootstrap // kemudian di konsol kita akan melihat hasil berikut: // https://www.yandex.ru/ // http://getboottrap.com/

Misalnya, pertimbangkan bagaimana mengatur setiap siklus pada elemen DOM yang memiliki nama nama (dengan memindahkan semua elemen dari kelas yang sama).

Raspberry Pi.
komputasi satu-papan
Intel Galileo Gen2.
19$
Pine A64 Plus.

Misalnya, kami akan menganalisis cara membahas semua item pada halaman.

Misalnya, tarik nilai semua elemen input pada halaman.

$ ("Input"). Setiap (konsol.log ($ (ini) .val ());));

Misalnya, dengan memindahkan semua elemen anak yang berlokasi di UL dengan id \u003d "MyList" (setiap anak).

  • Html.
  • Javascript.

Pertimbangkan metode yang dapat Anda definisikan indeks terakhir (elemen) dalam jQuery setiap metode.

// pilih elemen var mylist \u003d $ ("ul li"); // tentukan jumlah elemen dalam total sampel var \u003d MyList.length; // Kami melaksanakan elemen MyList yang dipilih. Setiap elemen (fungsi (indeks) (jika (indeks \u003d\u003d\u003d total - 1) (// Ini adalah elemen terakhir dalam sampel)));

Belum lama ini butuh saya Javascript Buat array asosiatif. Hebatnya, dia tidak pernah dibutuhkan sebelumnya Javascript.. Saya naik untuk mencari di internet, bagaimana melakukannya. Dan sangat terkejut bahwa sejumlah besar orang menulis bahwa itu tidak mungkin, di Javascript. Bukan itu. Untungnya, pengalaman bertahun-tahun saya menyarankan saya bahwa mereka membawa omong kosong. Karena itu, pada akhirnya, saya belajar cara Membuat Array Asosiatif dalam JavascriptApa dan beri tahu Anda dalam artikel ini.

Kode ditulis di bawah ini di mana array asosiatif dibuatKemudian maka elemen lain ditambahkan dan, akhirnya, array dipindahkan melalui siklus:

Dalam artikel ini kami tinjau menciptakan masif asosiatif., perubahan mereka, serta bangkrut penuh melalui siklus untuk. Secara pribadi saya gunakan array asosiatif dalam javascript Hanya satu hari, tetapi perlu untuk mengetahui tentang kemungkinan seperti itu.