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:
Object.keys = Object.keys || (function () {
var hasOwnProperty = Object.prototype.hasOwnProperty,
hasDontEnumBug = !{toString:null}.propertyIsEnumerable("toString"),
DontEnums = [
'toString', 'toLocaleString', 'valueOf', 'hasOwnProperty',
'isPrototypeOf', 'propertyIsEnumerable', 'constructor'
],
DontEnumsLength = DontEnums.length;
return function (o) {
if (typeof o != "object" && typeof o != "function" || o === null)
throw new TypeError("Object.keys called on a non-object");
var result = [];
for (var name in o) {
if (hasOwnProperty.call(o, name))
result.push(name);
}
if (hasDontEnumBug) {
for (var i = 0; i < DontEnumsLength; i++) {
if (hasOwnProperty.call(o, DontEnums[i]))
result.push(DontEnums[i]);
}
}
return result;
};
})();
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 .
_.keys(myJSONObject)