Come ha risposto Sam Dutton, un nuovo metodo proprio per questo scopo è stato introdotto in ECMAScript 5th Edition. Object.keys()
farà quello che vuoi ed è supportato in Firefox 4 , Chrome 6, Safari 5 e IE 9 .
Puoi anche implementare molto facilmente il metodo nei browser che non lo supportano. Tuttavia, alcune delle implementazioni disponibili non sono completamente compatibili con Internet Explorer. Ecco una soluzione più compatibile:
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;
};
})();
Si noti che la risposta attualmente accettata non include un controllo per hasOwnProperty () e restituirà proprietà ereditate attraverso la catena di prototipi. Inoltre, non tiene conto del famoso bug DontEnum in Internet Explorer in cui le proprietà non enumerabili nella catena di prototipi fanno sì che le proprietà dichiarate localmente con lo stesso nome ereditino l'attributo DontEnum.
L'implementazione di Object.keys () ti darà una soluzione più solida.
EDIT: a seguito di una recente discussione con kangax , noto collaboratore di Prototype, ho implementato la soluzione alternativa per il bug DontEnum basato sul codice per la sua Object.forIn()
funzione trovata qui .
_.keys(myJSONObject)