¿Iterando sobre cada propiedad de un objeto en javascript usando Prototype?

89

¿Hay alguna forma de iterar sobre cada propiedad de un objeto usando el marco de Prototype JavaScript?

Aquí está la situación: obtengo una respuesta AJAX en JSON que se parece a esto:

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

Si evalúo esa respuesta json en una variable response, quiero poder iterar sobre cada propiedad en el response.barobjobjeto para ver qué índices son verdaderos y cuáles son falsos.

El prototipo tiene ambos Object.keys()y, Object.values()curiosamente, ¡parece no tener una Object.each()función simple ! Podría tomar los resultados de Object.keys () y Object.values ​​() y hacer una referencia cruzada al otro mientras itero a través de uno, pero ese es un truco que estoy seguro de que hay una manera adecuada de hacerlo.

OverloadUT
fuente

Respuestas:

42

Primero debe convertir su objeto literal en un Prototype Hash :

// 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);
});
Tríptico
fuente
¡Perfecto! Esto es exactamente lo que estaba buscando.
OverloadUT
57
Desafortunadamente, dado que se cerró una pregunta similar, una que solo quería iterar sobre un objeto javascript simple sin Prototype, ahora tengo que tratar esta respuesta como si fuera la misma que la pregunta que se cerró debido a la "duplicación". Entonces, horrible ejemplo, ya que obliga al usuario a cargar Prototype. El usuario no dijo nada sobre Prototype, por lo que obligarlo a cargar una biblioteca no deseada no es útil. (recuerde, trate esto como si fuera realmente un duplicado). Si la otra pregunta no se hubiera cerrado debido a la falsa afirmación de duplicación, no tendría que rechazar la respuesta.
2
¿No mencionó el autor de la pregunta que querían un prototipo (o se editó la pregunta?)? De todos modos, todo está bien
emurano
No es necesario cargar una biblioteca externa
Healkiss
553

No hay necesidad de Prototype aquí: JavaScript tiene for..inbucles. Si no está seguro de que nadie se haya metido Object.prototype, verifique hasOwnProperty()también, es decir

for(var prop in obj) {
    if(obj.hasOwnProperty(prop))
        doSomethingWith(obj[prop]);
}
Christoph
fuente
140
Gracias por la respuesta real sin obligarnos a cargar una biblioteca no deseada.
8
esta no es la respuesta correcta. ¡Las preguntas indican que se debe utilizar un prototipo! libertad de elección - jaja ...
Sven Larson
1
El título original de esta pregunta mencionaba Prototipo, que he agregado nuevamente para mayor claridad. Esta pregunta, como lo demuestra la primera línea del cuerpo, se refería específicamente a un entorno en el que se usa Prototype.
OverloadUT
1
Cuanto más escribas Javascript, más odiarás escribir forbucles :)
Tríptico
13
Desafortunadamente, esta es la pregunta que aparece como n. ° 1 si busca en Google algo como "cómo iterar sobre cada propiedad de objeto javascript", por lo que muchas personas que vienen aquí probablemente estén buscando la respuesta a esta pregunta. La pregunta que quieren es esta: stackoverflow.com/questions/921789/… , que realmente no tiene nada que ver con los objetos literales.
Baxissimo
0

Debe iterar sobre las claves y obtener los valores utilizando corchetes.

Ver: ¿Cómo enumero las propiedades de un objeto javascript?

EDITAR: Obviamente, esto hace que la pregunta sea un duplicado.

Can Berk Güder
fuente
Ese método está fuertemente desaconsejado en los documentos de Prototype: prototypejs.org/api/array
OverloadUT
1
Además, no creo que esto sea un duplicado porque estaba buscando una solución nativa de Prototype, que es lo que obtuve. La otra pregunta es decente para alguien que no quiere que use un marco, pero esta solución es mucho más segura si está usando Prototype.
OverloadUT
1
@OverloadUT: no leyó con suficiente atención: se desaconseja iterar sobre las propiedades de las matrices, no sobre los objetos simples
Christoph