Katakanlah saya membuat objek dengan demikian:
var myObject =
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
Apa cara terbaik untuk mengambil daftar nama properti? yaitu saya ingin berakhir dengan beberapa 'kunci' variabel sehingga:
keys == ["ircEvent", "method", "regex"]
javascript
Johnstok
sumber
sumber
_.keys(myJSONObject)
Jawaban:
Di browser modern (IE9 +, FF4 +, Chrome5 +, Opera12 +, Safari5 +) Anda dapat menggunakan metode Object.keys bawaan :
Di atas memiliki polyfill lengkap tetapi versi yang disederhanakan adalah:
Atau ganti
var getKeys
denganObject.prototype.keys
untuk memungkinkan Anda memanggil.keys()
objek apa pun. Memperluas prototipe memiliki beberapa efek samping dan saya tidak akan merekomendasikan melakukannya.sumber
for (var key in myObject) {...}
Teknik ini berguna untuk runtimes javascript luar browser dan V8. Misalnya, ketika meneruskan permintaan pengurangan peta javascript ke RiakObject
objek tidak ada, jadiObject.keys
metode ini tidak tersedia.Object.keys
hanya mengembalikan properti objek itu sendiri. Saya melihatnya sebagai perbedaan penting.Seperti yang ditunjukkan slashnick , Anda dapat menggunakan konstruk "for in" untuk beralih pada objek untuk nama atributnya. Namun Anda akan mengulangi semua nama atribut dalam rantai prototipe objek. Jika Anda ingin hanya mengulangi atribut objek itu sendiri, Anda dapat menggunakan metode Object # hasOwnProperty () . Dengan demikian memiliki yang berikut.
sumber
esc
kunci karena objek itu memiliki sekitar satu juta properti, kebanyakan dari mereka tidak digunakan, dan saya memiliki peringatan tentang itu.Sebagaimana Sam Dutton menjawab, metode baru untuk tujuan ini telah diperkenalkan dalam ECMAScript Edisi ke-5.
Object.keys()
akan melakukan apa yang Anda inginkan dan didukung di Firefox 4 , Chrome 6, Safari 5 dan IE 9 .Anda juga dapat dengan mudah mengimplementasikan metode di browser yang tidak mendukungnya. Namun, beberapa implementasi di luar sana tidak sepenuhnya kompatibel dengan Internet Explorer. Inilah solusi yang lebih kompatibel:
Perhatikan bahwa jawaban yang saat ini diterima tidak termasuk cek untuk hasOwnProperty () dan akan mengembalikan properti yang diwarisi melalui rantai prototipe. Itu juga tidak memperhitungkan bug DontEnum yang terkenal di Internet Explorer di mana properti yang tidak dapat dihitung pada rantai prototipe menyebabkan properti yang dideklarasikan secara lokal dengan nama yang sama untuk mewarisi atribut DontEnum mereka.
Menerapkan Object.keys () akan memberi Anda solusi yang lebih kuat.
EDIT: mengikuti diskusi baru-baru ini dengan kangax , kontributor terkenal untuk Prototipe, saya mengimplementasikan solusi untuk bug DontEnum berdasarkan kode untuk
Object.forIn()
fungsinya yang ditemukan di sini .sumber
Object.prototype
. Namun, sering terjadi bahwa kode yang lebih pendek terlihat jauh lebih menarik daripada kode yang lebih besar dan lebih kuat, tetapi inti dari jawaban ini adalah menggunakan ECMAScript 5Object.keys()
, yang dapat diimplementasikan di browser yang tidak mendukungnya menggunakan kode ini. Versi asli akan lebih performan daripada ini.Object.keys
hanya mengembalikan array string yang sesuai dengan properti enumerable dari suatu objek. Ini mungkin tidak penting ketika bekerja dengan objek asli (yang ditentukan pengguna), tetapi harus sangat terlihat dengan objek host (meskipun perilaku objek host yang tidak ditentukan adalah cerita yang terpisah - menyakitkan -). Untuk menghitung lebih dari SEMUA properti (termasuk non-enumerable), ES5 menyediakanObject.getOwnPropertyNames
(lihat dukungannya di tabel compat. - kangax.github.com/es5-compat-table )Object.keys(stuff)
dan tidakstuff.keys()
?Perhatikan bahwa Object.keys dan metode ECMAScript 5 lainnya didukung oleh Firefox 4, Chrome 6, Safari 5, IE 9 dan lebih tinggi.
Sebagai contoh:
Tabel kompatibilitas ECMAScript 5: http://kangax.github.com/es5-compat-table/
Deskripsi metode baru: http://markcaudill.com/index.php/2009/04/javascript-new-features-ecma5/
sumber
Object.getOwnPropertyNames(obj)
Fungsi ini juga menunjukkan properti yang tidak dapat dihitung selain yang ditunjukkan oleh
Object.keys(obj)
.Di JS, setiap properti memiliki beberapa properti, termasuk boolean
enumerable
.Secara umum, properti non-enumerable lebih "internalis" dan lebih jarang digunakan, tetapi kadang-kadang wawasan untuk melihat mereka untuk melihat apa yang sebenarnya terjadi.
Contoh:
Perhatikan juga bagaimana:
Object.getOwnPropertyNames
danObject.keys
jangan naik rantai prototipe untuk menemukanbase
for in
tidakLebih lanjut tentang rantai prototipe di sini: https://stackoverflow.com/a/23877420/895245
sumber
Saya penggemar berat fungsi dump.
http://ajaxian.com/archives/javascript-variable-dump-in-coldfusion
sumber
https://j11y.io/demos/prettyprint/
?Bisa melakukannya dengan jQuery sebagai berikut:
sumber
jika Anda mencoba untuk mendapatkan elemen saja tetapi bukan fungsinya maka kode ini dapat membantu Anda
ini adalah bagian dari implementasi HashMap saya dan saya hanya ingin kunci, "ini" adalah objek hashmap yang berisi kunci
sumber
Ini akan berfungsi di sebagian besar browser, bahkan di IE8, dan tidak ada perpustakaan apa pun yang diperlukan. var saya adalah kunci Anda.
sumber
Di bawah browser yang mendukung js 1.8:
sumber
Mozilla memiliki detail implementasi lengkap tentang cara melakukannya di browser yang tidak didukung, jika itu membantu:
Anda dapat memasukkannya
extensions.js
sesuka Anda, tetapi mungkin di beberapa jenis file di bagian atas tumpukan skrip Anda.sumber
Menggunakan
Reflect.ownKeys()
Object.keys dan Object.getOwnPropertyNames tidak bisa mendapatkan properti yang tidak dapat dihitung . Ini berfungsi bahkan untuk properti yang tidak dapat dihitung .
sumber
IE tidak mendukung untuk (i in obj) untuk properti asli. Berikut adalah daftar semua alat peraga yang dapat saya temukan.
Tampaknya stackoverflow melakukan beberapa penyaringan bodoh.
Daftar ini tersedia di bagian bawah posting grup google ini: - https://groups.google.com/group/hackvertor/browse_thread/thread/a9ba81ca642a63e0
sumber
Karena saya menggunakan underscore.js di hampir setiap proyek, saya akan menggunakan
keys
fungsi:Output dari itu adalah:
sumber
Membangun jawaban yang diterima.
Jika Objek memiliki properti yang ingin Anda panggil katakan .properties () coba!
sumber
Solusinya bekerja pada kasing dan lintas browser saya:
sumber