For..In bucles en JavaScript: pares clave-valor

Resuelto Joris Ooms asked hace 13 años • 19 respuestas

Me preguntaba si hay una manera de hacer algo como un foreachbucle PHP en JavaScript. La funcionalidad que estoy buscando es algo como este fragmento de PHP:

foreach($data as $key => $value) { }

Estaba mirando el for..inbucle JS, pero parece que no hay forma de especificar el archivo as. Si hago esto con un bucle for 'normal' ( for(var i = 0; i < data.length; i++), ¿hay alguna manera de tomar los pares clave => valor?

Joris Ooms avatar Aug 30 '11 17:08 Joris Ooms
Aceptado
for (var k in target){
    if (target.hasOwnProperty(k)) {
         alert("Key is " + k + ", value is " + target[k]);
    }
}

hasOwnPropertyse utiliza para comprobar si targetrealmente tienes esa propiedad, en lugar de haberla heredado de su prototipo. Un poco más simple sería:

for (var k in target){
    if (typeof target[k] !== 'function') {
         alert("Key is " + k + ", value is" + target[k]);
    }
}

Simplemente verifica que kno sea un método (como si targetlo fuera, arrayrecibirá alertas sobre muchos métodos, por ejemplo indexOf, pushetc. pop)

J0HN avatar Aug 30 '2011 10:08 J0HN

Si puede usar ES6 de forma nativa o con Babel (compilador js), puede hacer lo siguiente:

const test = {a: 1, b: 2, c: 3};

for (const [key, value] of Object.entries(test)) {
  console.log(key, value);
}
Expandir fragmento

Que imprimirá este resultado:

a 1
b 2
c 3

El Object.entries()método devuelve una matriz de pares de propiedades enumerables propios de un objeto determinado [key, value], en el mismo orden que el proporcionado por un for...inbucle (la diferencia es que un bucle for-in también enumera las propiedades en la cadena del prototipo) .

  • Documentación de entradas de objetos
  • para...de documentación
  • Documentación de la tarea de desestructuración
  • Documentación de enumerabilidad y propiedad de propiedades.
Francesco Casula avatar Jun 15 '2017 14:06 Francesco Casula

Nadie lo ha mencionado Object.keysasí que lo mencionaré.

Object.keys(obj).forEach(function (key) {
   // do something with obj[key]
});
goatslacker avatar Aug 30 '2011 10:08 goatslacker

for...in funcionará para usted.

for( var key in obj ) {
  var value = obj[key];
}

En JavaScript moderno también puedes hacer esto:

for ( const [key,value] of Object.entries( obj ) ) {

}
Paul avatar Aug 30 '2011 10:08 Paul