Jika ada objek Javascript:
var objects={...};
Misalkan, ia memiliki lebih dari 50 properti, tanpa mengetahui nama properti (itu tanpa mengetahui 'kunci') bagaimana cara mendapatkan setiap nilai properti dalam satu lingkaran?
javascript
javascript-objects
Mellon
sumber
sumber
Jawaban:
Dengan menggunakan
for..in
loop sederhana :sumber
enumerable
flagnya disetel ke false. Ini - antara lain - berarti Anda tidak akan mengulangi metode kelas apa pun, tetapi Anda akan beralih menggunakan metode yang dibuat dengan cara lain.Bergantung pada browser mana yang harus Anda dukung, ini dapat dilakukan dengan beberapa cara. Mayoritas browser yang ada di wild mendukung ECMAScript 5 (ES5), tetapi perlu diingatkan bahwa banyak contoh di bawah ini digunakan
Object.keys
, yang tidak tersedia di IE <9. Lihat tabel kompatibilitas .ECMAScript 3+
Jika Anda harus mendukung versi IE yang lebih lama, maka ini adalah opsi untuk Anda:
Bersarang
if
memastikan bahwa Anda tidak menyebutkan properti dalam rantai prototipe objek (yang merupakan perilaku yang hampir pasti Anda inginkan). Anda harus menggunakandaripada
karena ECMAScript 5+ memungkinkan Anda membuat objek tanpa prototipe
Object.create(null)
, dan objek ini tidak akan memilikihasOwnProperty
metode. Kode nakal juga dapat menghasilkan objek yang menimpahasOwnProperty
metode ini.ECMAScript 5+
Anda dapat menggunakan metode ini di browser apa pun yang mendukung ECMAScript 5 dan di atasnya. Ini mendapatkan nilai dari suatu objek dan menghindari penghitungan di atas rantai prototipe. Di mana
obj
objek Anda:Jika Anda menginginkan sesuatu yang sedikit lebih kompak atau Anda ingin berhati-hati dengan fungsi dalam loop, maka
Array.prototype.forEach
adalah teman Anda:Metode selanjutnya membangun array yang berisi nilai-nilai objek. Ini nyaman untuk diulang.
Jika Anda ingin membuat mereka yang menggunakan
Object.keys
aman terhadapnull
(sebagaimanafor-in
adanya), maka Anda dapat melakukannyaObject.keys(obj || {})...
.Object.keys
mengembalikan properti enumerable . Untuk beralih pada objek sederhana, ini biasanya cukup. Jika Anda memiliki sesuatu dengan properti non-enumerable yang perlu Anda kerjakan, Anda dapat menggunakanObject.getOwnPropertyNames
sebagai gantinyaObject.keys
.ECMAScript 2015+ (AKA ES6)
Array lebih mudah untuk diulang dengan ECMAScript 2015. Anda dapat menggunakan ini untuk keuntungan Anda saat bekerja dengan nilai satu-per-satu dalam satu lingkaran:
Menggunakan fungsi panah gemuk ECMAScript 2015, memetakan objek ke array nilai menjadi satu-liner:
ECMAScript 2015 memperkenalkan
Symbol
, contoh yang dapat digunakan sebagai nama properti. Untuk mendapatkan simbol dari objek yang akan disebutkan, gunakanObject.getOwnPropertySymbols
(fungsi ini adalah mengapaSymbol
tidak dapat digunakan untuk membuat properti pribadi).Reflect
API baru dari ECMAScript 2015 menyediakanReflect.ownKeys
, yang mengembalikan daftar nama properti (termasuk yang non-enumerable) dan simbol.Pemahaman array (jangan coba-coba menggunakan)
Pemahaman array telah dihapus dari ECMAScript 6 sebelum publikasi. Sebelum dihapus, solusi akan terlihat seperti:
ECMAScript 2017+
ECMAScript 2016 menambahkan fitur yang tidak memengaruhi subjek ini. Spesifikasi ECMAScript 2017 menambahkan
Object.values
danObject.entries
. Keduanya mengembalikan array (yang akan mengejutkan bagi sebagian orang mengingat analogi denganArray.entries
).Object.values
dapat digunakan apa adanya atau denganfor-of
loop.Jika Anda ingin menggunakan kunci dan nilainya, itu
Object.entries
untuk Anda. Ini menghasilkan array yang diisi dengan[key, value]
pasangan. Anda dapat menggunakan ini sebagaimana adanya, atau (perhatikan juga penugasan perusakan ECMAScript 2015) dalam satufor-of
lingkaran:Object.values
shimAkhirnya, sebagaimana dicatat dalam komentar dan oleh teh_senaus dalam jawaban lain, mungkin layak menggunakan salah satunya sebagai shim. Jangan khawatir, berikut ini tidak mengubah prototipe, itu hanya menambah metode
Object
(yang jauh lebih berbahaya). Menggunakan fungsi panah gemuk, ini dapat dilakukan dalam satu baris juga:yang sekarang dapat Anda gunakan seperti
Jika Anda ingin menghindari pencukuran ketika orang asli
Object.values
ada, maka Anda dapat melakukannya:Akhirnya...
Waspadai peramban / versi yang perlu Anda dukung. Di atas adalah benar di mana metode atau fitur bahasa diimplementasikan. Misalnya, dukungan untuk ECMAScript 2015 dimatikan secara default di V8 hingga baru-baru ini, yang mendukung browser seperti Chrome. Fitur-fitur dari ECMAScript 2015 harus dihindari sampai browser yang Anda maksud mendukung implementasi fitur-fitur yang Anda butuhkan. Jika Anda menggunakan babel untuk mengkompilasi kode Anda ke ECMAScript 5, maka Anda memiliki akses ke semua fitur dalam jawaban ini.
sumber
obj
dua kali. Saya kira membuat fungsi pembantu tidak dapat dihindari? Sesuatu seperti nilai (obj).Object.values = obj => Object.keys(obj).map(key => obj[key]);
Berikut adalah fungsi yang dapat digunakan kembali untuk memasukkan nilai ke dalam array. Dibutuhkan juga prototipe.
sumber
Object
tidak banyak masalah (Object.keys
adalah masalah umum), Anda mungkin berpikir untuk memodifikasi prototipe Obyek.hasOwnProperty()
? Bagaimana kuncinya diulang dalam loop dari objek yang tidak memiliki properti?Jika Anda memiliki akses ke Underscore.js, Anda dapat menggunakan
_.values
fungsi seperti ini:sumber
Jika Anda benar-benar menginginkan array Nilai, saya menemukan ini lebih bersih daripada membangun array dengan for ... in loop.
ECMA 5.1+
Perlu dicatat bahwa dalam kebanyakan kasus Anda tidak benar-benar membutuhkan array nilai, akan lebih cepat untuk melakukan ini:
Ini beralih pada kunci Objek o. Dalam setiap iterasi k diatur ke kunci o.
sumber
ES5
Object.keys
sumber
Anda dapat memutar melalui tombol:
akan menampilkan:
sumber
Untuk orang-orang yang beradaptasi awal di era CofeeScript, berikut ini adalah persamaan lain untuk itu.
Yang mungkin lebih baik dari ini karena
objects
dapat dikurangi untuk diketik lagi dan mengurangi keterbacaan.sumber
gunakan polyfill seperti:
lalu gunakan
3) keuntungan!
sumber
ECMA2017 dan selanjutnya:
Object.values(obj)
akan menjemput Anda semua nilai properti sebagai array.https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_objects/Object/values
sumber
Rupanya - seperti yang baru saya pelajari - ini adalah cara tercepat untuk melakukannya:
sumber
Pertanyaannya tidak menentukan apakah ingin properti yang diwarisi dan tidak dapat dihitung juga.
Ada pertanyaan untuk mendapatkan semuanya, properti yang diwarisi dan properti yang tidak dapat dihitung juga , yang tidak dapat dengan mudah ditemukan oleh Google.
Solusi saya untuk itu adalah:
Dan kemudian beralih di atasnya, cukup gunakan for-of loop:
Tampilkan cuplikan kode
sumber
Menggunakan:
Object.values()
:, kami meneruskan objek sebagai argumen dan menerima array nilai sebagai nilai balik.Ini mengembalikan array dari objek tertentu yang memiliki nilai properti enumerable. Anda akan mendapatkan nilai yang sama dengan menggunakan
for in
loop tetapi tanpa properti pada Prototipe. Contoh ini mungkin akan membuat segalanya lebih jelas:sumber
sumber
Berikut fungsi yang mirip dengan array_values PHP ()
Berikut cara mendapatkan nilai objek jika Anda menggunakan ES6 atau lebih tinggi:
sumber
Kompatibel dengan ES7 bahkan beberapa browser belum mendukungnya
Karena,
Object.values(<object>)
akan built-in di ES7 &Sampai menunggu semua browser untuk mendukungnya, Anda dapat membungkusnya di dalam suatu fungsi:
Kemudian :
Setelah browser menjadi kompatibel dengan ES7, Anda tidak perlu mengubah apa pun dalam kode Anda.
sumber
Saya sadar saya sedikit terlambat tetapi ini adalah shim untuk
Object.values
metode firefox 47 yang barusumber
Object.entries melakukannya dengan cara yang lebih baik.
sumber
const myObj = { a:1, b:2, c:3 }
Dapatkan semua nilai:
cara terpendek:
const myValues = Object.values(myObj)
const myValues = Object.keys(myObj).map(key => myObj[key])
sumber
sumber
dalam penggunaan ECMAScript5
Kalau tidak, jika peramban Anda tidak mendukungnya, gunakan yang terkenal
for..in loop
sumber
object[key]
untuk mendapatkan nilai dalam satu lingkaran.for..in
(dan hasOwnProperty) sehingga tidak benar-benar mendapatkan apa-apa .. Saya berharap ECMAScript ke-5 didefinisikanObject.pairs
(danObject.items
untuk[[key, value], ..]
), tapi sayangnya, tidak.Sekarang saya menggunakan Dojo Toolkit karena browser lama tidak mendukung
Object.values
.Keluaran:
sumber
menggunakan
dan jika Anda menggunakan google chrome buka Konsol dengan menggunakan Ctrl + Shift + j
Goto >> Konsol
sumber