Come faccio a enumerare le proprietà di un oggetto JavaScript?


Answers

Utilizza un ciclo for..in per enumerare le proprietà di un oggetto, ma fai attenzione. L'enumerazione restituirà proprietà non solo dell'oggetto che viene enumerato, ma anche dei prototipi di qualsiasi oggetto padre.

var myObject = {foo: 'bar'};

for (var name in myObject) {
  alert(name);
}

// results in a single alert of 'foo'

Object.prototype.baz = 'quux';

for (var name in myObject) {
  alert(name);
}

// results in two alerts, one for 'foo' and one for 'baz'

Per evitare di includere proprietà ereditate nell'enumerazione, controlla hasOwnProperty() :

for (var name in myObject) {
  if (myObject.hasOwnProperty(name)) {
    alert(name);
  }
}

Modifica: non sono d'accordo con l'affermazione di JasonBunting che non dobbiamo preoccuparci di enumerare le proprietà ereditate. Esiste il pericolo di enumerare le proprietà ereditate che non ci si aspetta, poiché può modificare il comportamento del codice.

Non importa se questo problema esiste in altre lingue; il fatto è che esiste e JavaScript è particolarmente vulnerabile poiché le modifiche al prototipo di un oggetto interessano oggetti figlio anche se la modifica avviene dopo l'istanziazione.

Questo è il motivo per cui JavaScript fornisce hasOwnProperty() , ed è per questo che dovresti usarlo per assicurarti che il codice di terze parti (o qualsiasi altro codice che possa modificare un prototipo) non infrange il tuo. Oltre all'aggiunta di alcuni byte in più di codice, non esiste uno svantaggio nell'utilizzo di hasOwnProperty() .

Question

Questa domanda ha già una risposta qui:

Come faccio a enumerare le proprietà di un oggetto JavaScript?

In realtà voglio elencare tutte le variabili definite e i loro valori, ma ho imparato che la definizione di una variabile crea effettivamente una proprietà dell'oggetto finestra.




for (prop in obj) {
    alert(prop + ' = ' + obj[prop]);
}



Ecco come enumerare le proprietà di un oggetto:

var params = { name: 'myname', age: 'myage' }

for (var key in params) {
  alert(key + "=" + params[key]);
}



Sono ancora un principiante in JavaScript, ma ho scritto una piccola funzione per stampare in modo ricorsivo tutte le proprietà di un oggetto e dei suoi figli:

getDescription(object, tabs) {
  var str = "{\n";
  for (var x in object) {
      str += Array(tabs + 2).join("\t") + x + ": ";
      if (typeof object[x] === 'object' && object[x]) {
        str += this.getDescription(object[x], tabs + 1);
      } else {
        str += object[x];
      }
      str += "\n";
  }
  str += Array(tabs + 1).join("\t") + "}";
  return str;
}



Se stai cercando di enumerare le proprietà per scrivere un nuovo codice sull'oggetto, ti consiglio di utilizzare un debugger come Firebug per vederle visivamente.

Un'altra tecnica pratica consiste nell'utilizzare Object.toJSON () di Prototype per serializzare l'oggetto su JSON, che mostrerà sia i nomi di proprietà che i valori.

var data = {name: 'Violet', occupation: 'character', age: 25, pets: ['frog', 'rabbit']};
Object.toJSON(data);
//-> '{"name": "Violet", "occupation": "character", "age": 25, "pets": ["frog","rabbit"]}'

http://www.prototypejs.org/api/object/tojson







Semplice codice JavaScript:

for(var propertyName in myObject) {
   // propertyName is what you want.
   // You can get the value like this: myObject[propertyName]
}

jQuery:

jQuery.each(obj, function(key, value) {
   // key is what you want.
   // The value is in: value
});