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.
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
Les anciennes versions de JavaScript (
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']]
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(', ');
}
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]);
}
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 */
}
});
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