var obj = {
name: "Simon",
age: "20",
clothing: {
style: "simple",
hipster: false
}
}
for(var propt in obj){
console.log(propt + ': ' + obj[propt]);
}
Como a variável propt
representa as propriedades do objeto? Não é um método ou propriedade interno. Por que ele cria todas as propriedades do objeto?
javascript
loops
object
Rafay
fonte
fonte
if (typeof(obj[propt]) === 'object') {
/ * Faça isso de novo * /}
Respostas:
A iteração sobre propriedades requer esta
hasOwnProperty
verificação adicional :É necessário porque o protótipo de um objeto contém propriedades adicionais para o objeto que são tecnicamente parte do objeto. Essas propriedades adicionais são herdadas da classe de objeto base, mas ainda são propriedades de
obj
.hasOwnProperty
simplesmente verifica se essa é uma propriedade específica dessa classe e não herdada da classe base.Também é possível chamar
hasOwnProperty
através do próprio objeto:Mas isso falhará se o objeto tiver um campo não relacionado com o mesmo nome:
É por isso que é mais seguro fazê-lo
Object.prototype
:fonte
object.hasOwnProperty()
? O fato deproperty
ter algum valor não implica que está dentroobject
?property
é uma string aqui, deveria ter sido chamadapropertyName
. Caso contrário, pode causar confusão para iniciantes em JS como eu, ou seja, o que fazer dentro doif
.No JavaScript 1.8.5, você pode usar
Object.keys(obj)
para obter uma matriz de propriedades definida no próprio objeto (aquelas que retornam verdadeirasobj.hasOwnProperty(key)
).Isso é melhor (e mais legível) do que usar um loop for-in.
É suportado nestes navegadores:
Veja o Mozilla Developer Network Object.keys () 's de referência para mais informações.
fonte
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
... parece legível para mimGarotas e garotos que estamos em 2019 e não temos muito tempo para digitar ... Então, vamos fazer este novo ECMAScript 2016 chique e legal:
fonte
obj=window.performance.memory
: - / Onde, comofor in
faz. isto é,var obj = window.performance.memory; for( key in obj ) console.log( 'key=' + key + ' val=' + obj[key] );
window.performance.memory
é suportado apenas pelo chrome eObject.keys(obj)
retorna uma matriz vazia. Isso não tem nada a ver com.map
.e
, publiquei essa essência. É basicamente como a maioria das implementações de hash, e usa em(
(key)
=>
(value)
)
vez de{
key
=>
value
}
, mas se você não teve que lidar com isso antes, poderia ajudá-lo a visualizá-lo melhor: gist.github.com/the-nose-knows/9f06e745a56ff20519707433e28a4fa8É o
for...in statement
( MDN , especificação ECMAScript ).Você pode lê-lo como " PARA cada propriedade IN do
obj
objeto, atribuir a cada estabelecimento até o propt variável por sua vez".fonte
in
operador eafor
declaração não estão envolvidos em tudo, afor-in
declaração representa uma produção de gramática em sua própria:for ( LeftHandSideExpression in Expression )
,for ( var VariableDeclarationNoIn in Expression )
Nas implementações atualizadas do ES, você pode usar
Object.entries
:ou
Se você deseja iterar sobre os valores, use Object.values:
ou
fonte
É apenas um
for...in
loop. Confira a documentação no Mozilla .fonte
Se o seu ambiente suportar o ES2017 , eu recomendaria o Object.entries :
Conforme mostrado na documentação do Mozillas Object.entries () :
Basicamente, com Object.entries, podemos abrir mão da seguinte etapa extra que é necessária com o loop for ... in mais antigo :
fonte
O jquery permite que você faça isso agora:
fonte
$.each({foo:1, length:0, bar:2}, function(k,v){console.log(k,v)})
$ .each não é adequado para objetos. Se um objeto tiver uma propriedade length e seu valor for zero, todo o objeto será tratado como se fosse uma matriz vazia.A resposta de Dominik é perfeita, eu prefiro fazê-lo dessa maneira, pois é mais fácil ler:
fonte
Object
em maiúsculas, não?As respostas acima são um pouco irritantes, porque elas não explicam o que você faz dentro do loop for depois de garantir que é um objeto: VOCÊ NÃO A ACEITA DIRETAMENTE! Na verdade, você recebeu apenas a CHAVE que precisa aplicar ao OBJ:
Tudo isso é seguro para ECMA5. Até funciona nas versões lame JS como Rhino;)
fonte
Para adicionar o uso de ES2015 de
Reflect.ownKeys(obj)
e também iterar sobre as propriedades por meio de um iterador.Por exemplo:
pode ser iterado por
Se você deseja iterar diretamente sobre os valores das chaves de um objeto, pode definir um
iterator
, assim como os iteradores padrão do JavaScipts para strings, matrizes, matrizes digitadas, Map e Set.JS tentará iterar através da propriedade padrão do iterador, que deve ser definida como
Symbol.iterator
.Se você deseja iterar sobre todos os objetos, pode adicioná-lo como um protótipo de Object:
Isso permitiria que você iterasse sobre os valores de um objeto com um loop for ... of, por exemplo:
Cuidado : ao escrever esta resposta (junho de 2018), todos os outros navegadores, exceto o IE, suportam geradores e
for...of
iteração viaSymbol.iterator
fonte
fonte
forEach
pula valores vazios , acho que você pode se livrar do if e apenas fazerObject.keys(obj).forEach(e => console.log(`key=${e} value=${obj[e]}`));
como a resposta de Frank Roth.O loop for ... in representa cada propriedade em um objeto porque é como um loop for. Você definiu propt no loop for ... in, fazendo:
Um loop for ... in itera pelas propriedades enumeráveis de um objeto. Qualquer variável que você definir ou colocar no loop for ... in será alterada cada vez que for para a próxima propriedade que itera. A variável no loop for ... in itera pelas chaves, mas o valor dela é o valor da chave. Por exemplo:
Você pode ver como a variável difere do valor da variável. Em contraste, um loop for ... faz o oposto.
Eu espero que isso ajude.
fonte
fonte
forEach
é mais apropriado aqui, poismap
se destina a retornar uma nova matriz com os resultados da chamada do bloco de código em cada iteração. Mas estamos interessados apenas nos efeitos colaterais de cada iteração, não no valor de retorno; portanto, não precisamos da nova matriz quemap
nos fornece.fonte
Você pode usar o Lodash. A documentação
fonte
Seu
for
loop está repetindo todas as propriedades do objetoobj
.propt
é definido na primeira linha do seu loop for. É uma string que é o nome de uma propriedade doobj
objeto. Na primeira iteração do loop,propt
seria "nome".fonte
Objetos em JavaScript são coleções de propriedades e, portanto, podem ser repetidos em um para cada instrução.
Você deve pensar
obj
como uma coleção de valores-chave.fonte
Atualmente, você pode converter um objeto JS padrão em um objeto iterável apenas adicionando um método Symbol.iterator. Em seguida, você pode usar um
for of
loop e acessar seus valores diretamente ou até mesmo usar um operador de propagação no objeto. Legal. Vamos ver como podemos fazer isso:fonte
function*
descoberta!Se estiver executando o Node , recomendo:
fonte
Embora a resposta com a melhor classificação esteja correta, aqui está um caso de uso alternativo, ou seja, se você estiver iterando sobre um objeto e quiser criar uma matriz no final. Use em
.map
vez deforEach
fonte
Também adicionando a maneira recursiva:
Uso:
fonte
O que o loop for..in faz é que ele cria uma nova variável (var someVariable) e, em seguida, armazena cada propriedade do objeto especificado nessa nova variável (someVariable) uma por uma. Portanto, se você usar o bloco {}, poderá iterar. Considere o seguinte exemplo.
fonte
obj[someVariable]
. Talvez a razão pela qual foi tão prejudicada seja porque não é recursiva. Portanto, isso não seria uma solução adequada se você tiver um objeto altamente estruturado.Aqui, eu estou iterando cada nó e criando nomes significativos de nós. Se você notar, instanceOf Array e instanceOf Object praticamente fazem a mesma coisa (no meu aplicativo, estou fornecendo uma lógica diferente)
nota - Estou inspirado na resposta de Ondrej Svejdar. Mas esta solução tem melhor desempenho e menos ambígua
fonte
Você basicamente deseja percorrer cada propriedade no objeto.
JSFiddle
fonte
obj(prop)
<- TypeError: obj não é uma funçãohasOwnProperty
atributo. Deve funcionar agora.Quero adicionar as respostas acima, porque você pode ter intenções diferentes do Javascript. Um objeto JSON e um objeto Javascript são coisas diferentes, e você pode querer percorrer as propriedades de um objeto JSON usando as soluções propostas acima e, em seguida, surpreender-se.
Suponha que você tenha um objeto JSON como:
A maneira errada de iterar através de suas 'propriedades':
Você pode ser surpreendido de ver o registro do console
0
,1
etc., quando a iteração através das propriedadesprop1
eprop2
eprop3_1
. Esses objetos são sequências e os índices de uma sequência são propriedades desse objeto em Javascript.Uma maneira melhor de iterar recursivamente através das propriedades de um objeto JSON seria primeiro verificar se esse objeto é uma sequência ou não:
fonte
Para refinar ainda mais a resposta aceita, vale a pena notar que, se você instanciar o objeto com um
var object = Object.create(null)
,object.hasOwnProperty(property)
acionará um TypeError. Portanto, para estar do lado seguro, você precisa chamá-lo do protótipo assim:fonte
Verifique este link que ajudará https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_state_forin
fonte