Come posso accedere alle proprietà di un oggetto javascript se non conosco i nomi?


Answers

Le versioni precedenti di JavaScript (<ES5) richiedono l'uso di un ciclo for..in :

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

ES5 introduce Object.keys e Array#forEach che lo rendono un po 'più semplice:

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 introduce Object.values e Object.entries .

Object.values(data) // ['bar', 'quux']
Object.entries(data) // [['foo', 'bar'], ['baz', 'quux']]
Question

Supponi di avere un oggetto javascript come questo:

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

È possibile accedere alle proprietà tramite il nome della proprietà:

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

Ma è possibile ottenere questi valori se non si conosce il nome delle proprietà? La natura non ordinata di queste proprietà rende impossibile distinguerle?

Nel mio caso sto pensando specificamente a una situazione in cui una funzione deve accettare una serie di coppie nome-valore, ma i nomi delle proprietà possono cambiare.

I miei pensieri su come fare questo finora è passare i nomi delle proprietà alla funzione insieme ai dati, ma questo sembra un trucco. Preferirei farlo con l'introspezione, se possibile.




Spesso vorrete esaminare le proprietà particolari di un'istanza di un oggetto, senza tutti i suoi metodi e proprietà di prototipo condivisi:

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

    return A.join(', ');
}



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 */
   }
});