recorrer - ¿Cómo enumero las propiedades de un objeto JavaScript?




recorrer array de objetos javascript (10)

Aquí es cómo enumerar las propiedades de un objeto:

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

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

Esta pregunta ya tiene una respuesta aquí:

¿Cómo enumero las propiedades de un objeto JavaScript?

Realmente quiero enumerar todas las variables definidas y sus valores, pero he aprendido que definir una variable en realidad crea una propiedad del objeto de ventana.


Código JavaScript simple:

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

El dictado de Python tiene el método de 'claves', y eso es realmente útil. Creo que en JavaScript podemos tener algo así:

function keys(){
    var k = [];
    for(var p in this) {
        if(this.hasOwnProperty(p))
            k.push(p);
    }
    return k;
}
Object.defineProperty(Object.prototype, "keys", { value : keys, enumerable:false });

EDITAR: Pero la respuesta de @carlos-ruana funciona muy bien. Probé Object.keys (ventana), y el resultado es el que esperaba.

EDITE después de 5 años: no es una buena idea extender Object , ya que puede entrar en conflicto con otras bibliotecas que quieran usar keys en sus objetos y provocará un comportamiento impredecible en su proyecto. La respuesta de @carlos-ruana es la forma correcta de obtener las claves de un objeto.



Lo encontré ... for (property in object) { // do stuff } listará todas las propiedades, y por lo tanto todas las variables declaradas globalmente en el objeto de la ventana ...


Puedes usar el for loop.

Si quieres usar una matriz:

Object.keys(object1)

Árbitro. Object.keys(obj)


Si está utilizando la biblioteca Underscore.js , puede usar las keys función:

_.keys({one : 1, two : 2, three : 3});
=> ["one", "two", "three"]

Suficientemente simple:

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

Ahora, no obtendrá variables privadas de esta manera porque no están disponibles.

EDITAR: @bitwiseplatypus tiene razón en que, a menos que use el método hasOwnProperty() , obtendrá propiedades que se heredan. Sin embargo, no sé por qué alguien familiarizado con la programación orientada a objetos esperaría algo menos. Normalmente, alguien que lo menciona ha sido sujeto a las advertencias de Douglas Crockford sobre esto, que aún me confunden un poco. Una vez más, la herencia es una parte normal de los lenguajes OO y, por lo tanto, es parte de JavaScript, a pesar de ser prototípico.

Ahora, dicho esto, hasOwnProperty() es útil para el filtrado, pero no necesitamos hacer una advertencia como si hubiera algo peligroso en obtener propiedades heredadas.

EDIT 2: @bitwiseplatypus muestra la situación que ocurriría si alguien agregara propiedades / métodos a sus objetos en un momento posterior al que escribió originalmente sus objetos (a través de su prototipo), si bien es cierto que esto puede causar un comportamiento inesperado , Yo personalmente no veo que sea mi problema por completo. Sólo una cuestión de opinión. Además, ¿qué sucede si diseño las cosas de tal manera que uso prototipos durante la construcción de mis objetos y, sin embargo, tengo un código que se repite sobre las propiedades del objeto y quiero todas las propiedades heredadas? No usaría hasOwnProperty() . Entonces, digamos, alguien agrega nuevas propiedades más tarde. ¿Es mi culpa si las cosas se comportan mal en ese momento? No lo creo. Creo que esta es la razón por la que jQuery, como ejemplo, ha especificado formas de extender su funcionamiento (a través de jQuery.extend y jQuery.fn.extend ).


Use un bucle for..in para enumerar las propiedades de un objeto, pero tenga cuidado. La enumeración devolverá las propiedades no solo del objeto que se está enumerando, sino también de los prototipos de cualquier objeto principal.

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'

Para evitar incluir propiedades heredadas en su enumeración, verifique hasOwnProperty() :

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

Edición: no estoy de acuerdo con la afirmación de JasonBunting de que no debemos preocuparnos por enumerar las propiedades heredadas. Existe el peligro de enumerar las propiedades heredadas que no espera, porque puede cambiar el comportamiento de su código.

No importa si este problema existe en otros idiomas; el hecho es que existe, y JavaScript es particularmente vulnerable ya que las modificaciones al prototipo de un objeto afectan a los objetos secundarios, incluso si la modificación tiene lugar después de la creación de instancias.

Esta es la razón por la que JavaScript proporciona hasOwnProperty() , y es por eso que debe usarlo para asegurarse de que el código de terceros (o cualquier otro código que pueda modificar un prototipo) no rompa el suyo. Además de agregar algunos bytes adicionales de código, no hay inconveniente en usar hasOwnProperty() .


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






properties