var obj = {
name: "Simon",
age: "20",
clothing: {
style: "simple",
hipster: false
}
}
for(var propt in obj){
console.log(propt + ': ' + obj[propt]);
}
¿Cómo propt
representa la variable las propiedades del objeto? No es un método o propiedad incorporado. ¿Por qué aparece con todas las propiedades en el objeto?
javascript
loops
object
Rafay
fuente
fuente
if (typeof(obj[propt]) === 'object') {
/ * Hazlo de nuevo * /}
Respuestas:
Iterar sobre propiedades requiere esta
hasOwnProperty
verificación adicional :Es necesario porque el prototipo de un objeto contiene propiedades adicionales para el objeto que técnicamente son parte del objeto. Estas propiedades adicionales se heredan de la clase de objeto base, pero siguen siendo propiedades de
obj
.hasOwnProperty
simplemente verifica si esta es una propiedad específica de esta clase, y no una heredada de la clase base.También es posible llamar a
hasOwnProperty
través del objeto en sí:Pero esto fallará si el objeto tiene un campo no relacionado con el mismo nombre:
Es por eso que es más seguro llamarlo
Object.prototype
:fuente
object.hasOwnProperty()
? ¿El hecho de queproperty
tenga algún valor no implica que está dentroobject
?property
es una cadena aquí, debería haberse llamadopropertyName
. De lo contrario, puede causar confusión a los novatos de JS como yo, es decir, qué hacer dentro delif
.A partir de JavaScript 1.8.5, puede usar
Object.keys(obj)
para obtener una matriz de propiedades definidas en el objeto en sí (las que devuelven verdadero paraobj.hasOwnProperty(key)
).Esto es mejor (y más legible) que usar un bucle for-in.
Es compatible con estos navegadores:
Consulte la referencia de Object.keys () de Mozilla Developer Network para obtener más información.
fuente
Object.keys(myObject).forEach(function(key,index) { //key = the name of the object key //index = the ordinal position of the key within the object });
for candidate in candidateStatus
... me parece legibleChicas y chicos estamos en 2019 y no tenemos tanto tiempo para escribir ... Así que hagamos este nuevo e interesante ECMAScript 2016:
fuente
obj=window.performance.memory
: - / Donde como lofor in
hace. es decirvar obj = window.performance.memory; for( key in obj ) console.log( 'key=' + key + ' val=' + obj[key] );
window.performance.memory
solo es compatible con Chrome yObject.keys(obj)
devuelve una matriz vacía. Esto no tiene nada que ver con eso.map
.e
, he publicado esta idea. Básicamente es como la mayoría de las implementaciones de hash, y usa en(
(key)
=>
(value)
)
lugar de{
key
=>
value
}
, pero si no ha tenido que lidiar con eso antes, podría ayudarlo a visualizarlo mejor: gist.github.com/the-nose-knows/9f06e745a56ff20519707433e28a4fa8Es la
for...in statement
( MDN , especificación ECMAScript ).Puede leerlo como " PARA cada propiedad EN el
obj
objeto, asigne cada propiedad a la variable PROPT a su vez".fuente
in
operador y lafor
declaración no están involucrados en absoluto, lafor-in
afirmación representa una producción gramatical en su propia:for ( LeftHandSideExpression in Expression )
,for ( var VariableDeclarationNoIn in Expression )
En implementaciones actualizadas de ES, puede usar
Object.entries
:o
Si solo desea iterar sobre los valores, use Object.values:
o
fuente
Es solo un
for...in
bucle. Consulte la documentación en Mozilla .fuente
Si su entorno es compatible con ES2017 , recomendaría Object.entries :
Como se muestra en la documentación de Object.entries () de Mozillas :
Básicamente con Object.entries podemos renunciar al siguiente paso adicional que se requiere con el anterior para ... en bucle:
fuente
jquery te permite hacer esto ahora:
fuente
$.each({foo:1, length:0, bar:2}, function(k,v){console.log(k,v)})
$ .each no es adecuado para objetos. Si un objeto tiene una propiedad de longitud y su valor es cero, todo el objeto se trata como si fuera una matriz vacía.La respuesta de Dominik es perfecta, solo prefiero hacerlo de esa manera, ya que es más claro de leer:
fuente
Object
embargo, debe estar en mayúscula o, ¿no?Las respuestas anteriores son un poco molestas porque no explican lo que haces dentro del ciclo for después de asegurarte de que es un objeto: ¡NO LO ACCEDES DIRECTAMENTE! En realidad, solo se le entrega la CLAVE que debe aplicar al OBJ:
Todo esto es seguro para ECMA5. Incluso funciona en las versiones JS cojo como Rhino;)
fuente
Para agregar el uso de ES2015
Reflect.ownKeys(obj)
y también iterar sobre las propiedades a través de un iterador.Por ejemplo:
puede ser iterado por
Si desea iterar directamente sobre los valores de las claves de un objeto, puede definir un
iterator
, al igual que los iteradores predeterminados de JavaScipts para cadenas, matrices, matrices escritas, Map y Set.JS intentará iterar a través de la propiedad de iterador predeterminada, que debe definirse como
Symbol.iterator
.Si desea poder iterar sobre todos los objetos, puede agregarlo como un prototipo de Objeto:
Esto le permitiría iterar sobre los valores de un objeto con un bucle for ... of, por ejemplo:
Precaución : al escribir esta respuesta (junio de 2018), todos los demás navegadores, excepto IE, admiten generadores e
for...of
iteración a través deSymbol.iterator
fuente
fuente
forEach
omite los valores vacíos , creo que podría deshacerse del if y simplemente hacerObject.keys(obj).forEach(e => console.log(`key=${e} value=${obj[e]}`));
como la respuesta de Frank Roth.El bucle for ... in representa cada propiedad de un objeto porque es como un bucle for. Definiste propt en el for ... in loop haciendo:
Un bucle for ... in itera a través de las propiedades enumerables de un objeto. Cualquier variable que defina, o ponga en el bucle for ... in, cambia cada vez que pasa a la siguiente propiedad que itera. La variable en el bucle for ... in itera a través de las claves, pero su valor es el valor de la clave. Por ejemplo:
Puede ver cómo la variable difiere del valor de la variable. En contraste, un bucle for ... of hace lo contrario.
Espero que esto ayude.
fuente
fuente
forEach
es más apropiado aquí, ya quemap
está destinado a devolver una nueva matriz con los resultados de llamar al bloque de código en cada iteración. Pero solo estamos interesados en los efectos secundarios de cada iteración, no en el valor de retorno, por lo tanto, no necesitamos esa nueva matriz quemap
nos brinda.fuente
Puedes usar Lodash. La documentación
fuente
Su
for
ciclo está iterando sobre todas las propiedades del objetoobj
.propt
se define en la primera línea de su bucle for. Es una cadena que es el nombre de una propiedad delobj
objeto. En la primera iteración del bucle,propt
sería "nombre".fuente
Los objetos en JavaScript son colecciones de propiedades y, por lo tanto, se pueden enlazar en una para cada declaración.
Debe pensar
obj
como una colección de valores clave.fuente
Hoy en día, puede convertir un objeto JS estándar en un objeto iterable simplemente agregando un método Symbol.iterator. Luego puede usar un
for of
bucle y acceder a sus valores directamente o incluso puede usar un operador de propagación en el objeto también. Frio. Veamos cómo podemos hacerlo:fuente
function*
descubrimiento!Si ejecuta Node , recomendaría:
fuente
Si bien la respuesta mejor calificada es correcta, aquí hay un caso de uso alternativo, es decir, si está iterando sobre un objeto y desea crear una matriz al final. Usar en
.map
lugar deforEach
fuente
Añadiendo también la forma recursiva:
Uso:
fuente
Lo que hace..in loop es que crea una nueva variable (var someVariable) y luego almacena cada propiedad del objeto dado en esta nueva variable (someVariable) una por una. Por lo tanto, si usa el bloque {}, puede iterar. Considere el siguiente ejemplo.
fuente
obj[someVariable]
. Quizás la razón por la que se rechazó tanto es porque no es recursivo. Por lo tanto, esta no sería una solución adecuada si tiene un objeto altamente estructurado.Aquí estoy iterando cada nodo y creando nombres de nodo significativos. Si nota, instanceOf Array e instanceOf Object prácticamente hace lo mismo (en mi aplicación, estoy dando una lógica diferente)
nota - Me inspira la respuesta de Ondrej Svejdar. Pero esta solución tiene un mejor rendimiento y es menos ambigua.
fuente
Básicamente, desea recorrer cada propiedad en el objeto.
JSFiddle
fuente
obj(prop)
<- TypeError: obj no es una funciónhasOwnProperty
atributo. Debería funcionar ahora.Quiero agregar a las respuestas anteriores, porque es posible que tenga diferentes intenciones de Javascript. Un objeto JSON y un objeto Javascript son cosas diferentes, y es posible que desee recorrer las propiedades de un objeto JSON utilizando las soluciones propuestas anteriormente, y luego sorprenderse.
Suponga que tiene un objeto JSON como:
La forma incorrecta de iterar a través de sus 'propiedades':
Puede que se sorprenda de ver la conexión de la consola
0
,1
etc. cuando se repite a través de las propiedades deprop1
yprop2
y deprop3_1
. Esos objetos son secuencias, y los índices de una secuencia son propiedades de ese objeto en Javascript.Una mejor manera de iterar recursivamente a través de las propiedades de un objeto JSON sería verificar primero si ese objeto es una secuencia o no:
fuente
Para refinar aún más la respuesta aceptada, vale la pena señalar que si crea una instancia del objeto con un,
var object = Object.create(null)
entoncesobject.hasOwnProperty(property)
activará un TypeError. Entonces, para estar seguro, deberías llamarlo desde el prototipo de esta manera:fuente
Consulte este enlace, lo ayudará https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_state_forin
fuente