Jak odpowiedział Sam Dutton, w ECMAScript 5th Edition wprowadzono nową metodę do tego właśnie celu. Object.keys()zrobi co chcesz i jest obsługiwany w Firefox 4 , Chrome 6, Safari 5 i IE 9 .
Możesz także bardzo łatwo zaimplementować tę metodę w przeglądarkach, które jej nie obsługują. Jednak niektóre implementacje nie są w pełni kompatybilne z programem Internet Explorer. Oto bardziej kompatybilne rozwiązanie:
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;
};
})();
Zauważ, że obecnie akceptowana odpowiedź nie obejmuje sprawdzenia hasOwnProperty () i zwróci właściwości, które są dziedziczone w łańcuchu prototypów. Nie uwzględnia również słynnego błędu DontEnum w programie Internet Explorer, w którym właściwości niepoliczalne w łańcuchu prototypów powodują, że lokalnie zadeklarowane właściwości o tej samej nazwie dziedziczą ich atrybut DontEnum.
Implementacja Object.keys () zapewni bardziej niezawodne rozwiązanie.
EDYCJA: po niedawnej dyskusji z Kangaxem , znanym współpracownikiem Prototypu, zaimplementowałem obejście błędu DontEnum na podstawie kodu jego Object.forIn()funkcji znalezionej tutaj .
_.keys(myJSONObject)