Comment puis-je accéder aux propriétés d'un objet javascript si Je ne connais pas les noms?

Disons que vous avez un objet javascript comme ceci:

var data = { foo: 'bar', baz: 'quux' };

Vous pouvez accéder aux propriétés par le nom de la propriété:

var foo = data.foo;
var baz = data["baz"];

Mais est-il possible d'obtenir ces valeurs si vous ne connaissez pas le nom des propriétés? Est-ce que la nature non ordonnée de ces propriétés rend impossible de les distinguer?

Dans mon cas, je pense spécifiquement à une situation où une fonction doit accepter une série de paires nom-valeur, mais les noms des propriétés peuvent changer.

Mon réflexions sur la façon de le faire jusqu'à présent est de passer les noms des propriétés à la fonction avec les données, mais cela ressemble à un hack. Je préférerais le faire avec l'introspection si possible.

115
demandé sur Adam Lassek 2009-03-24 00:05:43

7 réponses

Vous pouvez parcourir les clés comme ceci:

for (var key in data) {
  console.log(key);
}

Cela enregistre " nom " et "valeur".

Si vous avez un type d'objet plus complexe (pas seulement un objet de type hachage simple, comme dans la question d'origine), vous voudrez seulement parcourir les clés qui appartiennent à l'objet lui-même, par opposition aux clés du prototype :

for (var key in data) {
  if (data.hasOwnProperty(key)) {
    console.log(key);
  }
}

Comme vous l'avez noté, les clés ne sont pas garanties dans un ordre particulier. Notez comment cela diffère de ce qui suit:

for each (var value in data) {
  console.log(value);
}

Ce exemple boucle à travers les valeurs, de sorte qu'il serait log Property Name et 0. N.B.: le for each la syntaxe n'est généralement prise en charge que dans Firefox, mais pas dans les autres navigateurs.

Si vos navigateurs cibles prennent en charge ES5, ou si votre site inclut es5-shim.js (recommandé), vous pouvez également utiliser Object.keys:

var data = { Name: 'Property Name', Value: '0' };
console.log(Object.keys(data)); // => ["Name", "Value"]

Et boucle avec Array.prototype.forEach:

Object.keys(data).forEach(function (key) {
  console.log(data[key]);
});
// => Logs "Property Name", 0
131
répondu Ron DeVera 2014-02-22 07:00:34

Les anciennes versions de JavaScript (for..in:

for (var key in data) {
  if (data.hasOwnProperty(key)) {
    // do something with key
  }
}

ES5 introduit Objet.clés et Array # forEach ce qui rend cela un peu plus facile:

var data = { foo: 'bar', baz: 'quux' };

Object.keys(data); // ['foo', 'baz']
Object.keys(data).map(function(key){ return data[key] }) // ['bar', 'quux']
Object.keys(data).forEach(function (key) {
  // do something with data[key]
});

ES2017 introduit Object.values et Object.entries.

Object.values(data) // ['bar', 'quux']
Object.entries(data) // [['foo', 'bar'], ['baz', 'quux']]
51
répondu Adam Lassek 2017-04-25 22:48:20
for(var property in data) {
    alert(property);
}
10
répondu karim79 2009-03-23 21:09:15

Vous voudrez souvent examiner les propriétés particulières d'une instance d'un objet, sans toutes ses méthodes et propriétés prototypes partagées:

 Obj.prototype.toString= function(){
        var A= [];
        for(var p in this){
            if(this.hasOwnProperty(p)){
                A[A.length]= p+'='+this[p];
            }
        }

    return A.join(', ');
}
4
répondu kennebec 2009-03-24 01:30:42
function getDetailedObject(inputObject) {
    var detailedObject = {}, properties;

    do {
        properties = Object.getOwnPropertyNames( inputObject );
        for (var o in properties) {
            detailedObject[properties[o]] = inputObject[properties[o]];
        }
    } while ( inputObject = Object.getPrototypeOf( inputObject ) );

    return detailedObject;
}

Cela obtiendra toutes les propriétés et leurs valeurs (héritées ou propres, énumérables ou non) dans un nouvel objet. objet d'origine est intacte. Maintenant, le nouvel objet peut être traversé en utilisant

var obj = { 'b': '4' }; //example object
var detailedObject = getDetailedObject(obj);
for(var o in detailedObject) {
    console.log('key: ' + o + '   value: ' + detailedObject[o]);
}
3
répondu Shishir Arora 2015-05-21 00:32:29
var fs   = require("fs");

fs.stat( process.argv[1], function( err, stats ){
if (err) {
     console.log( err.message ); 
     return;    
} else {
 console.log(JSON.stringify(stats));

/*  this is the answer here  */

    for (var key in Object.keys(stats)){
    var t = Object.keys( stats )[key];
    console.log( t + " value =: " + stats[t]  );
     }  

/*  to here, run in node */
   }
});
0
répondu Cloid J. Green 2013-03-12 20:49:09
var attr, object_information='';

for(attr in object){

      //Get names and values of propertys with style (name : value)
      object_information += attr + ' : ' + object[attr] + '\n'; 

   }


alert(object_information); //Show all Object
-3
répondu isaax2 2013-04-15 15:09:29