Bagaimana saya bisa mengulang semua anggota dalam objek JavaScript termasuk nilai-nilai yang merupakan objek.
Misalnya, bagaimana saya bisa mengulanginya (mengakses "nama_Anda" dan "pesan_Anda" untuk masing-masing)?
var validation_messages = {
"key_1": {
"your_name": "jimmy",
"your_msg": "hello world"
},
"key_2": {
"your_name": "billy",
"your_msg": "foo equals bar"
}
}
javascript
edt
sumber
sumber
Jawaban:
sumber
for in
sangat mirip dengan tradisionalforeach
.Di bawah ECMAScript 5, Anda dapat menggabungkan
Object.keys()
danArray.prototype.forEach()
:sumber
for ... in ... hasOwnProperty
pola dapat disebut pada apa pun, sejauh yang saya tahu (objek, array, null, terdefinisi, true, false, nomor primitif, objek).Object.keys()
yang membuatnya lambat, ini lebih merupakanforEach()
dan akses berulang ke.length
! Jika Anda menggunakan klasikfor
-loop sebaliknya, itu hampir dua kali lebih cepatfor..in
+hasOwnProperty()
di Firefox 33.Masalahnya dengan ini
adalah bahwa Anda juga akan mengulang melalui prototipe objek primitif.
Dengan ini, Anda akan menghindarinya:
sumber
hasOwnProperty
di dalamfor
-in
loop Anda.Dalam ES6 / 2015 Anda dapat mengulangi objek seperti ini: (menggunakan fungsi panah )
jsbin
Di ES7 / 2016 Anda bisa menggunakan dan
Object.entries
bukanObject.keys
melalui objek seperti ini:Di atas juga akan berfungsi sebagai satu-liner :
jsbin
Jika Anda ingin mengulangi objek bersarang juga, Anda dapat menggunakan fungsi rekursif (ES6):
jsbin
Sama seperti fungsi di atas, tetapi dengan ES7
Object.entries()
bukannyaObject.keys()
:Di sini kita loop melalui objek bersarang mengubah nilai dan mengembalikan objek baru dalam sekali pakai menggunakan
Object.entries()
dikombinasikan denganObject.fromEntries()
( ES10 / 2019 ):sumber
Menggunakan Underscore.js
_.each
:sumber
Jika Anda menggunakan rekursi, Anda dapat mengembalikan properti objek dari kedalaman apa pun.
sumber
I. kunci perlu diakses,
✔
of
danObject.keys
pendekatan✔
in
pendekatannyaGunakan yang ini dengan hati-hati, karena dapat mencetak properti prototipe dari
obj
✔ pendekatan ES7
Namun, pada saat edit saya tidak akan merekomendasikan metode ES7, karena JavaScript menginisialisasi banyak variabel secara internal untuk membangun prosedur ini (lihat umpan balik sebagai bukti). Kecuali jika Anda tidak mengembangkan aplikasi besar yang perlu dioptimalkan, maka itu boleh saja tetapi jika optimasi adalah prioritas Anda, Anda harus memikirkannya.
II kita hanya perlu mengakses setiap nilai,
✔
of
danObject.values
pendekatanUmpan balik lebih lanjut tentang tes:
Object.keys
atauObject.values
kinerja dapat diabaikanContohnya,
Sebagai
Object.values
contoh, menggunakanfor
loop asli dengan variabel yang di-cache di Firefox tampaknya sedikit lebih cepat daripada menggunakanfor...of
loop. Namun perbedaannya tidak begitu penting dan Chrome berjalanfor...of
lebih cepat darifor
loop asli , jadi saya akan merekomendasikan untuk digunakanfor...of
ketika berhadapan denganObject.values
kasus apa pun (tes ke-4 dan ke-6).Di Firefox,
for...in
loopnya sangat lambat, jadi ketika kami ingin men-cache kunci selama iterasi, lebih baik digunakanObject.keys
. Plus Chrome menjalankan kedua struktur dengan kecepatan yang sama (tes 1 dan terakhir).sumber
Saya tahu ini terlambat, tetapi saya butuh waktu 2 menit untuk menulis versi AgileJon yang dioptimalkan dan diperbaiki ini:
sumber
hasOwnProperty
dalamowns
dan kemudian memanggilowns.call(obj, prop)
bukan hanya menyebutobj.hasOwnProperty(prop)
sebagai jawaban ini tidak?obj
mungkin memilikihasOwnProperty
fungsi yang didefinisikan pada dirinya sendiri sehingga tidak akan menggunakan yang dariObject.prototype
. Anda dapat mencoba sebelumfor
loop seperti iniobj.hasOwnProperty = function(){return false;}
dan tidak akan mengulangi properti apa pun.sumber
p adalah nilainya
ATAU
sumber
Di ES7 Anda dapat melakukan:
sumber
sumber
Beberapa cara untuk melakukan itu ...
1) 2 lapisan untuk ... dalam lingkaran ...
2) Menggunakan
Object.key
3) Fungsi rekursif
Dan menyebutnya seperti:
sumber
Di sinilah versi perbaikan dan rekursif dari solusi AgileJon ( demo ):
Solusi ini bekerja untuk semua jenis kedalaman yang berbeda.
sumber
Pilihan lain:
sumber
ECMAScript-2017, baru saja selesai sebulan lalu, memperkenalkan Object.values (). Jadi sekarang Anda bisa melakukan ini:
sumber
Saya pikir itu layak menunjukkan bahwa jQuery menyelesaikan masalah ini dengan baik
$.each()
.Lihat: https://api.jquery.com/each/
Sebagai contoh:
$(this)
menjadi item tunggal di dalam objek. Tukar$('.foo')
ke variabel jika Anda tidak ingin menggunakan mesin pemilih jQuery.sumber
Untuk mengulang melalui objek JavaScript kita dapat menggunakan forEach dan untuk mengoptimalkan kode kita dapat menggunakan fungsi panah
sumber
Saya tidak bisa mendapatkan posting di atas untuk melakukan apa yang saya inginkan.
Setelah bermain-main dengan balasan lain di sini, saya membuat ini. Ini hacky, tetapi berhasil!
Untuk objek ini:
... kode ini:
... menghasilkan ini di konsol:
sumber
Solusi yang bekerja untuk saya adalah sebagai berikut
sumber
Eksotis satu - melintasi mendalam
Dalam solusi ini kami menggunakan replacer yang memungkinkan untuk melintasi seluruh objek dan objek bersarang - pada setiap level Anda akan mendapatkan semua bidang dan nilai. Jika Anda perlu mendapatkan path lengkap ke setiap bidang, lihat di sini
Tampilkan cuplikan kode
sumber
Dalam kasus saya (atas dasar sebelumnya) dimungkinkan sejumlah tingkat.
hasil:
sumber