Comment lister les propriétés d'un objet JavaScript?

dire que je crée un objet ainsi:

var myObject =
        {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};

Quelle est la meilleure façon de récupérer une liste des noms de propriété? c'est à dire que je voudrais terminer avec quelques variables clés " tels que:

keys == ["ircEvent", "method", "regex"]
733

16 réponses

dans les navigateurs modernes (IE9+, FF4+, Chrome5+, Opera12+, Safari5+), vous pouvez utiliser l'objet construit dans .clés méthode:

var keys = Object.keys(myObject);

le ci-dessus a un polyfill complet mais une version simplifiée est:

var getKeys = function(obj){
   var keys = [];
   for(var key in obj){
      keys.push(key);
   }
   return keys;
}

remplacer var getKeys par Object.prototype.keys pour vous permettre d'appeler .keys() sur n'importe quel objet. Étendre le prototype a des effets secondaires et je ne le recommande pas.

923
répondu slashnick 2016-01-14 21:50:01

comme slashnick souligné, vous pouvez utiliser la construction "for in" pour itérer sur un objet pour ses noms d'attribut. Cependant, vous allez itérer sur tous les noms d'attribut dans la chaîne prototype de l'objet. Si vous voulez itérer seulement sur les propres attributs de l'objet, vous pouvez utiliser la méthode #objet # hasOwnProperty() . Donc les suivantes.

for (var key in obj) {
    if (obj.hasOwnProperty(key)) {
        /* useful code here */
    }
}
240
répondu Pablo Cabrera 2017-05-23 11:47:28

comme Sam Dutton a répondu, une nouvelle méthode pour ce but même a été introduite dans ECMAScript 5ème é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 très facilement mettre en œuvre la méthode dans les navigateurs qui ne le prennent pas en charge. Cependant, certaines implémentations ne sont pas entièrement compatibles avec Internet Explorer. j'ai détaillé ce sur mon blog et produit 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 pour hasOwnProperty () et retournera les propriétés héritées par la chaîne de prototypes. Il ne tient pas compte non plus du fameux bug DontEnum dans Internet Explorer où des propriétés non-dénombrables sur la chaîne prototype provoquent des propriétés déclarées localement avec le même nom à hériter de leur attribut DontEnum.

Mise En Œuvre Objet.keys () vous donnera une solution plus robuste.

EDIT: suite à une discussion récente avec kangax , un contributeur bien connu au Prototype, j'ai mis en œuvre la solution de contournement pour le bogue de DontEnum basé sur le code pour sa Object.forIn() fonction trouvée ici .

97
répondu Andy E 2010-11-23 14:25:11

Notez cet objet.les clés et autres méthodes ECMAScript 5 sont supportées par Firefox 4, Chrome 6, Safari 5, IE 9 et plus.

par exemple:

var o = {"foo": 1, "bar": 2}; 
alert(Object.keys(o));

ECMAScript 5 Tableau de compatibilité: http://kangax.github.com/es5-compat-table /

Description des nouvelles méthodes: http://markcaudill.com/index.php/2009/04/javascript-new-features-ecma5 /

28
répondu Sam Dutton 2010-09-29 12:34:42

Object.getOwnPropertyNames(obj)

cette fonction présente également des propriétés non dénombrables en plus de celles indiquées par Object.keys(obj) .

En JS, chaque propriété a un peu de propriétés, y compris un booléen enumerable .

en général, les propriétés non dénombrables sont plus "internalistes" et moins souvent utilisées, mais c'est perspicace de les regarder parfois pour voir ce qui se passe réellement.

exemple:

var o = Object.create({base:0})
Object.defineProperty(o, 'yes', {enumerable: true})
Object.defineProperty(o, 'not', {enumerable: false})

console.log(Object.getOwnPropertyNames(o))
// [ 'yes', 'not' ]

console.log(Object.keys(o))
// [ 'yes' ]

for (var x in o)
    console.log(x)
// yes, base

aussi noter comment:

  • Object.getOwnPropertyNames et Object.keys ne pas aller en haut de la chaîne de prototype pour trouver base
  • for in ne

pour en savoir plus sur la chaîne prototype, Cliquez ici: https://stackoverflow.com/a/23877420/895245

19
16
répondu Matt 2017-02-08 14:19:34

pourrait le faire avec jQuery comme suit:

var objectKeys = $.map(object, function(value, key) {
  return key;
});
14
répondu sbonami 2012-12-13 23:26:24

si vous essayez d'obtenir les éléments seulement mais pas les fonctions alors ce code peut vous aider""

this.getKeys = function() {

    var keys = new Array();
    for(var key in this) {

        if( typeof this[key] !== 'function') {

            keys.push(key);
        }
    }
    return keys;
}

Cela fait partie de mon implémentation du HashMap et je ne veux que les clés, "ceci" est l'objet hashmap qui contient les clés

9
répondu zeacuss 2012-03-01 09:21:22

cela fonctionnera dans la plupart des navigateurs, même dans IE8 , et aucune bibliothèque d'aucune sorte ne sont nécessaires. var i est ta clé.

var myJSONObject =  {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"}; 
var keys=[];
for (var i in myJSONObject ) { keys.push(i); }
alert(keys);
8
répondu qwerty_jones 2012-07-16 16:12:56

sous navigateurs supportant js 1.8:

[i for(i in obj)]
7
répondu Rix Beck 2012-11-27 09:06:20

Mozilla a full détails de mise en œuvre sur la façon de le faire dans un navigateur où il n'est pas pris en charge, si cela aide:

if (!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 (obj) {
      if (typeof obj !== 'object' && typeof obj !== 'function' || obj === null) throw new TypeError('Object.keys called on non-object');

      var result = [];

      for (var prop in obj) {
        if (hasOwnProperty.call(obj, prop)) result.push(prop);
      }

      if (hasDontEnumBug) {
        for (var i=0; i < dontEnumsLength; i++) {
          if (hasOwnProperty.call(obj, dontEnums[i])) result.push(dontEnums[i]);
        }
      }
      return result;
    };
  })();
}

vous pouvez l'inclure comme vous le souhaitez, mais peut-être dans une sorte de fichier extensions.js en haut de votre pile de scripts.

6
répondu Kristofer Sommestad 2013-06-19 18:07:20

IE ne prend pas en charge for(i in obj) pour les propriétés natives. Voici une liste de tous les accessoires que j'ai pu trouver.

il semble que stackoverflow fasse un peu de filtrage stupide.

la liste est disponible en bas de ce message de groupe google:- https://groups.google.com/group/hackvertor/browse_thread/thread/a9ba81ca642a63e0

4
répondu 2009-06-03 13:54:12

puisque j'utilise underscore.js dans presque tous les projets, j'utiliserais la keys fonction:

var obj = {name: 'gach', hello: 'world'};
console.log(_.keys(obj));

dont le résultat sera:

['name', 'hello']
4
répondu schmijos 2015-08-13 15:09:26

s'appuyant sur la accepté de répondre.

si l'objet a des propriétés que vous voulez appeler say .propriétés() essayer!

var keys = Object.keys(myJSONObject);

for (j=0; j < keys.length; j++) {
  Object[keys[i]].properties();
}
2
répondu Sydwell 2015-04-28 18:14:26

La solution de travail sur mon cas et de la croix-navigateur:

var getKeys = function(obj) {
    var type = typeof  obj;
    var isObjectType = type === 'function' || type === 'object' || !!obj;

    // 1
    if(isObjectType) {
        return Object.keys(obj);
    }

    // 2
    var keys = [];
    for(var i in obj) {
        if(obj.hasOwnProperty(i)) {
            keys.push(i)
        }
    }
    if(keys.length) {
        return keys;
    }

    // 3 - bug for ie9 <
    var hasEnumbug = !{toString: null}.propertyIsEnumerable('toString');
    if(hasEnumbug) {
        var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',
            'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];

        var nonEnumIdx = nonEnumerableProps.length;

        while (nonEnumIdx--) {
            var prop = nonEnumerableProps[nonEnumIdx];
            if (Object.prototype.hasOwnProperty.call(obj, prop)) {
                keys.push(prop);
            }
        }

    }

    return keys;
};
0
répondu christian Nguyen 2016-08-07 17:08:09

utiliser Reflect.ownKeys()

var obj = {a: 1, b: 2, c: 3};
Reflect.ownKeys(obj) // ["a", "b", "c"]

objet.touches et .getOwnPropertyNames ne peut pas obtenir propriétés non-dénombrables . Il fonctionne même pour Non-énumérable propriétés.

var obj = {a: 1, b: 2, c: 3};
obj[Symbol()] = 4;
Reflect.ownKeys(obj) // ["a", "b", "c", Symbol()]
0
répondu selmansamet 2018-09-09 13:45:58