¿Cómo puedo recorrer todos los miembros en un objeto de JavaScript, incluidos los valores que son objetos?
Por ejemplo, ¿cómo podría recorrer esto (accediendo a "your_name" y "your_message" para cada uno)?
var validation_messages = {
"key_1": {
"your_name": "jimmy",
"your_msg": "hello world"
},
"key_2": {
"your_name": "billy",
"your_msg": "foo equals bar"
}
}
javascript
EDT
fuente
fuente
Respuestas:
fuente
for in
es muy similar a un tradicionalforeach
.En ECMAScript 5, puede combinar
Object.keys()
yArray.prototype.forEach()
:fuente
for ... in ... hasOwnProperty
patrón se puede invocar en cualquier cosa, por lo que puedo decir (objeto, matriz, nulo, indefinido, verdadero, falso, número primitivo, objetos).Object.keys()
que lo hace lento, es más bien elforEach()
acceso repetido.length
! Si utiliza un clásicofor
-loop, es casi el doble de rápido quefor..in
+hasOwnProperty()
en Firefox 33.El problema con esto
es que también recorrerás el prototipo del objeto primitivo.
Con este lo evitarás:
fuente
hasOwnProperty
el interior de susfor
-in
bucles.En ES6 / 2015 puede recorrer un objeto como este: (usando la función de flecha )
jsbin
En ES7 / 2016 puede usar en
Object.entries
lugar deObject.keys
y recorrer un objeto como este:Lo anterior también funcionaría como una línea :
jsbin
En caso de que también desee recorrer objetos anidados, puede usar una función recursiva (ES6):
jsbin
Igual que la función anterior, pero con ES7 en
Object.entries()
lugar deObject.keys()
:Aquí recorremos los valores anidados de los objetos anidados y devolveremos un nuevo objeto de una vez usando
Object.entries()
combinado conObject.fromEntries()
( ES10 / 2019 ):fuente
Usando Underscore.js
_.each
:fuente
Si usa la recursión, puede devolver propiedades de objeto de cualquier profundidad.
fuente
I. las claves deben ser accedidas,
✔ el
of
yObject.keys
enfoque✔ el
in
enfoqueUse este con precaución, ya que podría imprimir propiedades prototipo de
obj
✔ el enfoque ES7
Sin embargo, en el momento de la edición, no recomendaría el método ES7, porque JavaScript inicializa muchas variables internamente para crear este procedimiento (consulte las evaluaciones para obtener una prueba). A menos que no esté desarrollando una aplicación enorme que merezca optimización, entonces está bien, pero si la optimización es su prioridad, debe pensar en ello.
II solo necesitamos acceder a cada valor,
✔ el
of
yObject.values
enfoqueMás comentarios sobre las pruebas:
Object.keys
o elObject.values
rendimiento es insignificantePor ejemplo,
Por
Object.values
ejemplo, usar unfor
bucle nativo con variables en caché en Firefox parece ser un poco más rápido que usar unfor...of
bucle. Sin embargo la diferencia no es tan importante y Chrome se ejecutafor...of
más rápido que el nativofor
de bucle, por lo que recomiendo para su usofor...of
cuando se trata deObject.values
, en algún caso (4 y 6 pruebas).En Firefox, el
for...in
ciclo es realmente lento, por lo que cuando queremos almacenar en caché la clave durante la iteración, es mejor usarlaObject.keys
. Además, Chrome ejecuta ambas estructuras a la misma velocidad (primera y última prueba).fuente
Sé que es muy tarde, pero me tomó 2 minutos escribir esta versión optimizada y mejorada de la respuesta de AgileJon:
fuente
hasOwnProperty
enowns
y después de llamarowns.call(obj, prop)
en lugar de simplemente llamandoobj.hasOwnProperty(prop)
como esta respuesta hace?obj
podría tener lahasOwnProperty
función definida en sí misma, por lo que no utilizará la deObject.prototype
. Puede probar antes delfor
bucle como esteobj.hasOwnProperty = function(){return false;}
y no iterará sobre ninguna propiedad.fuente
p es el valor
O
fuente
En ES7 puedes hacer:
fuente
fuente
Pocas maneras de hacer eso ...
1) 2 capas para ... en bucle ...
2) Usando
Object.key
3) función recursiva
Y llámalo así:
fuente
Aquí viene la versión mejorada y recursiva de la solución ( demostración ) de AgileJon :
Esta solución funciona para todo tipo de profundidades diferentes.
fuente
Otra opción:
fuente
ECMAScript-2017, recién finalizado hace un mes, presenta Object.values (). Entonces ahora puedes hacer esto:
fuente
Creo que vale la pena señalar que jQuery soluciona esto muy bien con
$.each()
.Ver: https://api.jquery.com/each/
Por ejemplo:
$(this)
siendo el único elemento dentro del objeto. Cambie$('.foo')
a una variable si no desea utilizar el motor de selección de jQuery.fuente
Para recorrer el objeto JavaScript podemos usar forEach y para optimizar el código podemos usar la función de flecha
fuente
No pude hacer que las publicaciones anteriores hicieran lo que buscaba.
Después de jugar con las otras respuestas aquí, hice esto. ¡Es hacky, pero funciona!
Para este objeto:
... este código:
... produce esto en la consola:
fuente
La solución que funciona para mí es la siguiente
fuente
Uno exótico: recorrido profundo
En esta solución, utilizamos un sustituto que permite atravesar en profundidad objetos completos y objetos anidados; en cada nivel obtendrá todos los campos y valores. Si necesita obtener la ruta completa a cada campo, vea aquí
Mostrar fragmento de código
fuente
En mi caso (sobre la base de lo anterior) es posible cualquier cantidad de niveles.
resultado:
fuente