Mengapa for-for loop saya tidak mengulangi objek array asosiatif JavaScript saya?
// defining an array
var array = [];
// assigning values to corresponding keys
array["Main"] = "Main page";
array["Guide"] = "Guide page";
array["Articles"] = "Articles page";
array["Forum"] = "Forum board";
// expected: loop over every item,
// yet it logs only "last" assigned value - "Forum"
for (var i = 0; i < array.length; i++) {
console.log(array[i]);
}
EDIT: jQuery each()
dapat membantu: https://api.jquery.com/jQuery.each/
javascript
arrays
foreach
Szymon Toda
sumber
sumber
associative arrays
di JS: itu baik Array atau Obyek. Tidak ada yang mencegah menambahkan properti non-numerikArray
, tapi itu tidak membuatnyaassociative
- khususnya,length
properti tidak akan menghitung-otomatis properti ini.Jawaban:
The
.length
properti hanya melacak properti dengan indeks numerik (kunci). Anda menggunakan string untuk kunci.Kamu bisa melakukan ini:
Agar aman, itu ide yang bagus dalam loop seperti itu untuk memastikan bahwa tidak ada properti yang merupakan hasil pewarisan yang tidak terduga:
sunting - mungkin ide yang bagus sekarang untuk mencatat bahwa
Object.keys()
fungsi ini tersedia di browser modern dan di Node dll. Fungsi itu mengembalikan kunci "milik sendiri" suatu objek, sebagai sebuah array:Fungsi panggilan balik yang dilewati
.forEach()
dipanggil dengan setiap tombol dan indeks kunci dalam array dikembalikan olehObject.keys()
. Itu juga melewati array yang melaluinya fungsi iterating, tetapi array itu tidak benar-benar berguna bagi kita; kita membutuhkan objek aslinya . Itu dapat diakses secara langsung dengan nama, tetapi (menurut saya) itu sedikit lebih baik untuk meneruskannya secara eksplisit, yang dilakukan dengan memberikan argumen kedua ke.forEach()
- objek asli - yang akan terikat sepertithis
di dalam callback. (Hanya melihat bahwa ini dicatat dalam komentar di bawah.)sumber
var arr_jq_TabContents = {};
? Maksud saya {}[]
dan{}
? Hanya prototipe yang berbeda?Object.keys(arr_jq_TabContents).forEach( function(key) { ... } );
Ini adalah pendekatan yang sangat sederhana. Keuntungannya adalah Anda bisa mendapatkan kunci juga:
Untuk ES6:
Untuk ES6: (Jika Anda ingin nilai, indeks dan array itu sendiri)
sumber
var
dalam loop yang menyarankan pelingkupan yang tidak ada. Gunakanvar
di depan loop ataulet
di loop.for
loop menghasilkan lingkup terbatas pada tubuhfor
loop. Namun dalam JavaScript, variabel yang dideklarasikan olehvar
selalu berfungsi global meskipun Anda menulisnya dalam satufor
lingkaran. Lihat di sini: davidwalsh.name/for-and-against-letvar
di Javascript membuat variabel dalam memori bahkan setelah loop selesai.Sudah ada beberapa contoh langsung, tapi saya perhatikan dari bagaimana Anda mengatakan pertanyaan Anda bahwa Anda mungkin berasal dari latar belakang PHP, dan Anda mengharapkan JavaScript bekerja dengan cara yang sama - tidak. PHP
array
sangat berbeda dari JavaScriptArray
.Dalam PHP, array asosiatif dapat melakukan sebagian besar dari apa yang dapat diindeks oleh array numerik (
array_*
fungsi berfungsi, Anda bisacount()
, dll.) Anda cukup membuat array dan mulai menetapkan ke string-indeks bukan numerik.Dalam JavaScript, semuanya adalah objek (kecuali untuk primitif: string, numerik, boolean), dan array adalah implementasi tertentu yang memungkinkan Anda memiliki indeks numerik. Apa pun mendorong ke array akan mempengaruhi nya
length
, dan dapat mengulangi lebih menggunakan metode Array (map
,forEach
,reduce
,filter
,find
, dll) Namun, karena segala sesuatu adalah obyek, Anda selalu bebas untuk hanya sifat assign, karena itu sesuatu yang Anda lakukan untuk objek apa saja. Notasi persegi-braket hanyalah cara lain untuk mengakses properti, jadi dalam kasus Anda:sebenarnya setara dengan:
Dari uraian Anda, dugaan saya adalah Anda menginginkan 'array asosiatif', tetapi untuk JavaScript, ini adalah kasus sederhana menggunakan objek sebagai hashmap. Juga, saya tahu ini adalah contoh, tetapi hindari nama-nama yang tidak bermakna yang hanya menggambarkan tipe variabel (misalnya
array
), dan nama berdasarkan apa yang seharusnya berisi (misalnyapages
). Objek sederhana tidak memiliki banyak cara langsung yang baik untuk beralih, jadi sering kali kita akan berubah menjadi array terlebih dahulu menggunakanObject
metode (Object.keys
dalam hal ini - ada jugaentries
danvalues
ditambahkan ke beberapa browser sekarang) yang dapat kita loop.sumber
arr_jq_TabContents[key]
melihat array sebagai bentuk indeks-0.sumber
Berikut adalah cara sederhana untuk menggunakan array asosiatif sebagai tipe Objek generik:
sumber
Jika node.js atau browser didukung
Object.entries()
, ini dapat digunakan sebagai alternatif untuk menggunakanObject.keys()
( https://stackoverflow.com/a/18804596/225291 ).dalam contoh ini,
forEach
gunakan penugasan Destrukturisasi array.sumber
Ini (pada dasarnya) salah dalam banyak kasus:
Itu menciptakan properti non-elemen pada array dengan nama
Main
. Meskipun array adalah objek, biasanya Anda tidak ingin membuat properti non-elemen.Jika Anda ingin mengindeks
array
dengan nama-nama itu, biasanya Anda akan menggunakanMap
objek polos, bukan array.Dengan
Map
(ES2015 +), yang akan saya panggilmap
karena saya kreatif:Anda kemudian iterate itu menggunakan iterator dari yang
values
,keys
atauentries
metode, misalnya:Menggunakan objek biasa, yang akan saya sebut kreatif
obj
:Anda akan kemudian iterate isinya menggunakan
Object.keys
,Object.values
atauObject.entries
, misalnya:sumber
dalam kode ini saya menggunakan metode tanda kurung untuk nilai-nilai panggilan dalam array karena berisi array, namun secara singkat gagasan yang variabel saya memiliki kunci properti dan dengan loop yang disebut kedua nilai array asosiasi
Metode sempurna, jika Anda tertarik, tekan suka
sumber
Kamu bisa melakukan ini
sumber