web-dev-qa-db-fra.com

Comment 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? La nature non ordonnée de ces propriétés empêche-t-elle de les distinguer?

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

Mon idée sur la manière de procéder jusqu'à présent consiste à transmettre les noms des propriétés à la fonction avec les données, mais cela ressemble à un piratage. Je préférerais le faire avec introspection si possible.

115
Adam Lassek

Les anciennes versions de JavaScript (<ES5) nécessitent l’utilisation d’une boucle for..in:

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

ES5 introduit Object.keys et Array # forEach qui facilite un peu la tâche:

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']]
52
Adam Lassek

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 simple ressemblant à un hachage, comme dans la question initiale), vous souhaiterez uniquement faire une boucle sur les clés qui appartiennent à l'objet lui-même, par opposition aux clés de l'objet prototype :

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

Comme vous l'avez noté, il n'est pas garanti que les clés soient dans un ordre particulier. Notez en quoi cela diffère de ce qui suit:

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

Cet exemple parcourt les valeurs pour consigner Property Name et 0. NB: La syntaxe for each est principalement prise en charge 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
133
Ron DeVera
for(var property in data) {
    alert(property);
}
10
karim79

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 de prototype 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
kennebec
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. l'objet original est intact. Maintenant, 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
Shishir Arora
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
Cloid J. Green
var obj = {
 a: [1, 3, 4],
 b: 2,
 c: ['hi', 'there']
 }
for(let r in obj){  //for in loop iterates all properties in an object
 console.log(r) ;  //print all properties in sequence
 console.log(obj[r]);//print all properties values
}
0
Mayank_VK