Comme Sam Dutton a répondu, une nouvelle méthode à cet effet a été introduite dans ECMAScript 5e édition. Object.keys()
fera ce que vous voulez et est pris en charge dans Firefox 4 , Chrome 6, Safari 5 et IE 9 .
Vous pouvez également implémenter très facilement la méthode dans les navigateurs qui ne la prennent pas en charge. Cependant, certaines implémentations ne sont pas entièrement compatibles avec Internet Explorer. Voici une solution plus compatible:
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;
};
})();
Notez que la réponse actuellement acceptée n'inclut pas une vérification de hasOwnProperty () et renverra des propriétés héritées de la chaîne de prototype. Il ne prend pas non plus en compte le célèbre bogue DontEnum dans Internet Explorer où les propriétés non énumérables sur la chaîne de prototypes font en sorte que les propriétés déclarées localement avec le même nom héritent de leur attribut DontEnum.
L'implémentation d' Object.keys () vous donnera une solution plus robuste.
EDIT: suite à une récente discussion avec kangax , un contributeur bien connu de Prototype, j'ai implémenté la solution de contournement pour le bogue DontEnum basée sur le code de sa Object.forIn()
fonction trouvée ici .
_.keys(myJSONObject)