¿Cómo puedo hacer un bucle o enumerar un objeto de JavaScript?

Tengo un objeto JavaScript como el siguiente:

var p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3"
};

Ahora quiero recorrer todos los elementos p (p1, p2, p3...) y obtener sus claves y valores. ¿Cómo puedo hacerlo?

Puedo modificar el objeto JavaScript si es necesario. Mi objetivo final es hacer un bucle a través de algunos pares clave-valor y si es posible quiero evitar el uso de eval.

Solución

Puedes utilizar el bucle for-in como han mostrado otros. Sin embargo, también tienes que asegurarte de que la clave que obtienes es una propiedad real de un objeto, y no proviene del prototipo.

Aquí está el fragmento:

var p = {
    "p1": "value1",
    "p2": "value2",
    "p3": "value3"
};

for (var key in p) {
    if (p.hasOwnProperty(key)) {
        console.log(key + " -> " + p[key]);
    }
}

Para con la alternativa Object.keys():

var p = {
    0: "value1",
    "b": "value2",
    key: "value3"
};

for (var key of Object.keys(p)) {
    console.log(key + " -> " + p[key])
}

Fíjate en el uso de for-of en lugar de for-in, si no se usa devolverá undefined en las propiedades con nombre, y Object.keys() asegura el uso sólo de las propiedades propias del objeto sin las propiedades de toda la cadena de prototipos

Comentarios (27)

Puedes simplemente iterar sobre ella como:

for (var key in p) {
  alert(p[key]);
}

Ten en cuenta que key no tomará el valor de la propiedad, es sólo un valor de índice.

Comentarios (2)
for(key in p) {
  alert( p[key] );
}

Nota: puedes hacer esto sobre arrays, pero también iterarás sobre la longitud y otras propiedades.

Comentarios (5)