Iterando sobre todas as propriedades de um objeto em javascript usando Prototype?


89

Existe uma maneira de iterar sobre cada propriedade de um objeto usando o framework Prototype JavaScript?

Esta é a situação: estou recebendo uma resposta AJAX em JSON que se parece com isto:

{foo: 1, bar: 2, barobj: {75: true, 76: false, 85: true}}

Se eu avaliar essa resposta json em uma variável response, quero ser capaz de iterar sobre cada propriedade no response.barobjobjeto para ver quais índices são verdadeiros e quais são falsos.

Prototype tem ambos Object.keys()e, Object.values()mas estranhamente parece não ter uma Object.each()função simples ! Eu poderia pegar os resultados de Object.keys () e Object.values ​​() e cruzar a referência do outro enquanto itero em um, mas isso é um hack tão grande que tenho certeza de que há uma maneira adequada de fazer isso!

Respostas:


42

Você deve primeiro converter seu objeto literal em um Hash de protótipo :

// Store your object literal
var obj = {foo: 1, bar: 2, barobj: {75: true, 76: false, 85: true}}

// Iterate like so.  The $H() construct creates a prototype-extended Hash.
$H(obj).each(function(pair){
  alert(pair.key);
  alert(pair.value);
});

Perfeito! Isso é exatamente o que eu estava procurando.
SobrecargaUT

57
Infelizmente, uma vez que uma pergunta semelhante foi fechada, que apenas queria iterar sobre um objeto javascript simples sem Prototype, agora tenho que tratar essa resposta como se fosse a mesma que a pergunta que foi fechada devido à "duplicação". Então, um exemplo horrível, pois força o usuário a carregar o Prototype. O usuário não disse nada sobre Prototype, então forçá-los a carregar uma biblioteca indesejada não é útil. (lembre-se de tratar isso como se fosse realmente uma duplicata). Se a outra questão não tivesse sido encerrada devido à falsa alegação de duplicação, eu não teria que votar contra a resposta.

2
Quem fez a pergunta não mencionou que queria o Protótipo (ou a pergunta foi editada?)? Enfim está tudo bem
emurano

Não há necessidade de carregar uma biblioteca externa
Healkiss

553

Não há necessidade de Prototype aqui: JavaScript tem for..inloops. Se você não tem certeza de que ninguém mexeu com Object.prototype, verifique hasOwnProperty()também, ou seja,

for(var prop in obj) {
    if(obj.hasOwnProperty(prop))
        doSomethingWith(obj[prop]);
}

140
Obrigado pela resposta real sem nos forçar a carregar uma biblioteca indesejada.

8
esta não é a resposta certa. as questões afirmam que o protótipo deve ser usado! liberdade de escolha - haha ​​...
Sven Larson

1
O título original desta questão mencionava Protótipo, que acrescentei para maior clareza. Esta questão, como evidenciado pela primeira linha do corpo, estava perguntando especificamente sobre um ambiente no qual o Prototype está em uso.
SobrecargaUT

1
Quanto mais você escreve Javascript, mais você odeia escrever forloops :)
Triptych

13
Infelizmente, esta é a pergunta que aparece como # 1 se você pesquisar algo como "como iterar sobre cada javascript de propriedade de objeto" no Google, portanto, muitas pessoas que vêm aqui provavelmente estão procurando a resposta para essa pergunta. A pergunta que eles querem é esta: stackoverflow.com/questions/921789/… , que realmente não tem nada a ver com literais de objeto.
Baxissimo 01 de

0

Você deve iterar sobre as chaves e obter os valores usando colchetes.

Consulte: Como enumero as propriedades de um objeto javascript?

EDIT: Obviamente, isso torna a pergunta uma duplicata.


Esse método é fortemente desencorajado nos documentos do Prototype: prototypejs.org/api/array
SobrecargaUT

1
Além disso, não acho que seja uma duplicata porque eu estava procurando por uma solução nativa do Prototype que é o que eu consegui. A outra questão é decente para quem não quer usar um framework, mas esta solução é muito mais segura se você estiver usando Prototype.
SobrecargaUT

1
@OverloadUT: você não leu com cuidado o suficiente: é desencorajado a iterar nas propriedades de arrays, não em objetos simples
Christoph
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.