Comme l'a répondu Sam Dutton, une nouvelle méthode à cette fin a été introduite dans la 5e édition d'ECMAScript. Object.keys()
fera ce que vous voulez et est soutenu dans Firefox 4 Chrome 6, Safari 5 et IE 9 .
Vous pouvez aussi très facilement mettre en œuvre cette méthode dans les navigateurs qui ne la prennent pas en charge. Cependant, certaines des implémentations existantes 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 de vérification de la présence de hasOwnProperty() et renverra les propriétés qui sont héritées par la chaîne de prototypes. Elle ne tient pas compte non plus du fameux bogue DontEnum d'Internet Explorer, qui fait que les propriétés non dénombrables de la chaîne de prototypes font que les propriétés déclarées localement et portant le même nom héritent de leur attribut DontEnum.
Mise en œuvre de Objet.keys() vous donnera une solution plus robuste.
EDITAR: suite à une discussion récente avec kangax un contributeur bien connu de Prototype, j'ai mis en œuvre la solution de contournement pour le bogue DontEnum en me basant sur le code de son fichier Object.forIn()
fonction trouvée ici .
3 votes
Un peu hors sujet, mais si vous utilisez underscore.js :
_.keys(myJSONObject)
4 votes
TL;DR : Si vous voulez uniquement des propriétés énumérables :
Object.keys(obj)
Parfois, on veut aussi des propriétés non dénombrables. Assurez-vous de vous en souvenir si c'est le cas ! Pour les obtenir, utilisezObject.getOwnPropertyNames(obj)
stackoverflow.com/a/32413145/1599699