Sam Dutton'un yanıtladığı gibi, bu amaç için yeni bir yöntem ECMAScript 5. Baskıda tanıtıldı. Object.keys()
istediğinizi yapar ve Firefox 4 , Chrome 6, Safari 5 ve IE 9'da desteklenir .
Yöntemi, desteklemeyen tarayıcılara da kolayca uygulayabilirsiniz. Ancak, bazı uygulamalar Internet Explorer ile tam uyumlu değildir. İşte daha uyumlu bir çözüm:
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;
};
})();
Şu anda kabul edilen yanıtın hasOwnProperty () için bir denetim içermediğini ve prototip zinciri aracılığıyla devralınan özellikleri döndüreceğini unutmayın. Ayrıca, Internet Explorer'daki prototip zincirindeki numaralandırılamayan özelliklerin aynı adla yerel olarak bildirilen özelliklerin DontEnum özniteliklerini devralmasına neden olduğu ünlü DontEnum hatasını da hesaba katmaz.
Object.keys () uygulamak size daha sağlam bir çözüm sağlayacaktır.
EDIT: Prototip iyi bilinen bir katkıda bulunan kanguru ile yakın zamanda yapılan bir tartışma sonrasında , buradaObject.forIn()
bulunan işlevi için kod dayalı DontEnum hata için geçici çözüm uyguladı .
_.keys(myJSONObject)