Saya tahu di objek javascript berfungsi ganda sebagai hash tetapi saya tidak dapat menemukan fungsi bawaan untuk mendapatkan kunci
var h = {a:'b',c:'d'};
Saya menginginkan sesuatu seperti
var k = h.keys() ; // k = ['a','c'];
Sangat mudah untuk menulis fungsi sendiri untuk beralih item dan menambahkan kunci ke array yang saya kembalikan, tetapi apakah ada cara pembersih standar untuk melakukan itu?
Saya terus merasa itu pasti fungsi bawaan yang saya lewatkan tetapi saya tidak dapat menemukannya!
javascript
object
key
Menepuk
sumber
sumber
Jawaban:
Ada fungsi dalam JavaScript modern (ECMAScript 5) yang disebut
Object.keys
melakukan operasi ini:Detail kompatibilitas dapat ditemukan di sini .
Di situs Mozilla ada juga cuplikan untuk kompatibilitas mundur:
sumber
if(!Object.prototype.keys) Object.prototype.keys = function() { if (this !== Object(this)) throw new TypeError('Object.keys called on non-object'); var ret = [], p; for (p in this) if (Object.prototype.hasOwnProperty.call(this, p)) ret.push(p); return ret; } var x = { a: { A: 1, B: 2, C: 3 }, b: { A: 10, B: 20 } }; alert(x.a.keys());
Object.prototype.keys
akankeys
tersedia untuk semua sub-kelas Object, oleh karena itu untuk semua objek. Yang mungkin Anda inginkan jika Anda mencoba menggunakan OOP. Bagaimanapun ini sangat tergantung pada kebutuhan Anda.Untuk kode produksi yang membutuhkan kompatibilitas besar dengan browser klien saya masih menyarankan jawaban Ivan Nevostruev di atas dengan shim untuk memastikan
Object.keys
di browser yang lebih lama. Namun, dimungkinkan untuk mendapatkan fungsionalitas tepat yang diminta menggunakan ECMA yang barudefineProperty
fitur .Pada ECMAScript 5 - Object.defineProperty
Pada ECMA5 Anda dapat menggunakan
Object.defineProperty()
untuk mendefinisikan properti yang tidak dapat dihitung. The kompatibilitas saat masih banyak yang harus diinginkan, tapi ini akhirnya harus menjadi digunakan di semua browser. (Secara khusus catat ketidakcocokan saat ini dengan IE8!)Namun, karena ECMA5 sudah menambahkan
Object.keys
Anda mungkin juga menggunakan:Jawaban asli
Edit: Karena jawaban ini sudah ada untuk sementara waktu, saya akan membiarkan jawaban di atas tidak tersentuh. Siapa pun yang membaca ini juga harus membaca jawaban Ivan Nevostruev di bawah ini.
Tidak ada cara untuk membuat fungsi prototipe non-enumerable yang mengarah pada mereka selalu muncul di loop for-in yang tidak digunakan
hasOwnProperty
. Saya masih berpikir jawaban ini akan ideal jika memperluas prototipe Object tidak begitu berantakan.sumber
kamu bisa memakai
Object.keys
sumber
Anda bisa menggunakan Underscore.js , yang merupakan pustaka utilitas Javascript.
sumber
Object.prototype
_.keys(obj).length
untuk melihat apakah ada kunci.Ini yang terbaik yang bisa Anda lakukan, sejauh yang saya tahu ...
sumber
menggunakan jQuery Anda bisa mendapatkan kunci seperti ini:
Atau:
terima kasih kepada @pimlottc
sumber
JQuery.map
:$.map(h, function(v,k) { return k; });
Saya percaya Anda dapat mengulangi properti yang digunakan objek untuk / di, sehingga Anda dapat melakukan sesuatu seperti ini:
sumber
Saya ingin menggunakan jawaban berperingkat teratas di atas
Namun saat digunakan bersamaan dengan google maps API v3, google maps tidak berfungsi.
bekerja dengan baik.
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,
this
adalah objek hashmap yang berisi kuncisumber