Como posso percorrer todos os membros em um objeto JavaScript, incluindo valores que são objetos.
Por exemplo, como eu poderia percorrer isso (acessando o "seu_nome" e "sua_mensagem" para cada um)?
var validation_messages = {
"key_1": {
"your_name": "jimmy",
"your_msg": "hello world"
},
"key_2": {
"your_name": "billy",
"your_msg": "foo equals bar"
}
}
javascript
Edt
fonte
fonte
Respostas:
fonte
for in
é muito semelhante a um tradicionalforeach
.No ECMAScript 5, você pode combinar
Object.keys()
eArray.prototype.forEach()
:fonte
for ... in ... hasOwnProperty
padrão pode ser chamado em qualquer coisa, até onde eu saiba (objeto, matriz, nulo, indefinido, verdadeiro, falso, número primitivo, objetos).Object.keys()
que o torna lento, é sim oforEach()
e o acesso repetido a.length
! Se você usar um clássicofor
-loop vez, é quase duas vezes mais rápidofor..in
+hasOwnProperty()
no Firefox 33.O problema com isso
é que você também percorrerá o protótipo do objeto primitivo.
Com este, você o evitará:
fonte
hasOwnProperty
dentro de seusfor
-in
loops.No ES6 / 2015, você pode percorrer um objeto como este: (usando a função de seta )
jsbin
No ES7 / 2016, você pode usar em
Object.entries
vez deObject.keys
e fazer um loop através de um objeto como este:O acima também funcionaria como uma linha :
jsbin
Caso deseje fazer um loop através de objetos aninhados, você pode usar uma função recursiva (ES6):
jsbin
Igual à função acima, mas com ES7 em
Object.entries()
vez deObject.keys()
:Aqui, percorreremos objetos aninhados, alterar valores e retornar um novo objeto de uma só vez usando
Object.entries()
combinado comObject.fromEntries()
( ES10 / 2019 ):fonte
Usando o Underscore.js
_.each
:fonte
Se você usar recursão, poderá retornar propriedades de objetos de qualquer profundidade
fonte
I. as chaves precisam ser acessadas,
✔ a abordagem
of
eObject.keys
✔ a
in
abordagemUse este com cautela, pois pode imprimir propriedades protótipo de
obj
✔ a abordagem ES7
No entanto, no momento da edição, eu não recomendaria o método ES7, porque o JavaScript inicializa muitas variáveis internamente para criar esse procedimento (consulte os feedbacks para obter provas). A menos que você não esteja desenvolvendo um aplicativo enorme que mereça otimização, tudo bem, mas se a otimização for sua prioridade, pense nisso.
II só precisamos acessar cada valor,
✔ a abordagem
of
eObject.values
Mais feedbacks sobre os testes:
Object.keys
ouObject.values
desempenho é insignificantePor exemplo,
Por
Object.values
exemplo, o uso de umfor
loop nativo com variáveis em cache no Firefox parece ser um pouco mais rápido do que o uso de umfor...of
loop. No entanto, a diferença não é tão importante e Chrome está sendo executadofor...of
mais rápido do que nativafor
loop, então eu recomendaria a utilizaçãofor...of
quando se lida comObject.values
em todos os casos (4 e 6 testes).No Firefox, o
for...in
loop é muito lento; portanto, quando queremos armazenar em cache a chave durante a iteração, é melhor usá-laObject.keys
. Além disso, o Chrome está executando a estrutura em velocidade igual (primeiro e último teste).fonte
Sei que está muito tarde, mas levei dois minutos para escrever esta versão otimizada e aprimorada da resposta do AgileJon:
fonte
hasOwnProperty
emowns
e, em seguida, chamandoowns.call(obj, prop)
ao invés de apenas chamarobj.hasOwnProperty(prop)
como esta resposta faz?obj
pode ter ahasOwnProperty
função definida por si mesma, não utilizará a deObject.prototype
. Você pode tentar antes dofor
loop assimobj.hasOwnProperty = function(){return false;}
e ele não irá iterar sobre nenhuma propriedade.fonte
p é o valor
OU
fonte
No ES7, você pode fazer:
fonte
fonte
Poucas maneiras de fazer isso ...
1) 2 camadas para ... em loop ...
2) Usando
Object.key
3) função recursiva
E chame assim:
fonte
Aí vem a versão aprimorada e recursiva da solução AgileJon ( demo ):
Esta solução funciona para todos os tipos de profundidades diferentes.
fonte
Outra opção:
fonte
O ECMAScript-2017, finalizado há um mês, apresenta Object.values (). Então agora você pode fazer isso:
fonte
Eu acho que vale ressaltar que o jQuery classifica isso bem com
$.each()
.Consulte: https://api.jquery.com/each/
Por exemplo:
$(this)
sendo o único item dentro do objeto. Troque$('.foo')
para uma variável se você não quiser usar o mecanismo de seleção do jQuery.fonte
Para percorrer o JavaScript Object, podemos usar o forEach e, para otimizar o código, podemos usar a função de seta
fonte
Não consegui que as postagens acima fizessem exatamente o que eu estava procurando.
Depois de brincar com as outras respostas aqui, eu fiz isso. É hacky, mas funciona!
Para este objeto:
... este código:
... produz isso no console:
fonte
A solução que funciona para mim é a seguinte
fonte
Exótico - travessia profunda
Nesta solução, usamos o substituto que permite percorrer profundamente todo o objeto e objetos aninhados - em cada nível, você obterá todos os campos e valores. Se você precisar obter o caminho completo para cada campo, procure aqui
Mostrar snippet de código
fonte
No meu caso (com base no anterior) é possível qualquer número de níveis.
resultado:
fonte