2009-02-25 8 views
89

¿Hay alguna manera de iterar sobre cada propiedad de un objeto utilizando el marco Prototype JavaScript?¿Iterando sobre cada propiedad de un objeto en javascript usando Prototype?

Esta es la situación: estoy recibiendo una respuesta AJAX en JSON que se ve algo como esto:

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

Si evalúo que la respuesta JSON para una variable response, quiero ser capaz de iterar sobre cada uno propiedad en el objeto response.barobj para ver qué índices son verdaderos y cuáles son falsos.

El prototipo tiene Object.keys() y Object.values() pero extrañamente parece que no tiene una función simple Object.each()! Podría tomar los resultados de Object.keys() y Object.values ​​() y hacer una referencia cruzada de los otros mientras recorro uno, pero eso es un hack tal que estoy seguro de que hay una forma correcta de hacerlo.

Respuesta

42

Tienes que primero convert your object literal to a 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); 
}); 
+0

¡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 Prototipo, ahora debo tratar esta respuesta como si fuera la misma que la que se cerró debido a "duplicación". Por lo tanto, un ejemplo horrible ya que obliga al usuario a cargar Prototype. El usuario no dijo nada acerca de Prototype, por lo que forzarlos a cargar una biblioteca no deseada no es útil. (recuerde, tratar 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 dijo el solicitante que querían Prototype (o se editó la pregunta?)? De todos modos, todo está bien – emurano

0

Debe repetir las teclas y obtener los valores usando corchetes.

Ver: How do I enumerate the properties of a javascript object?

EDIT: Obviamente, esto hace que la cuestión de un duplicado.

+0

Ese método se recomienda en contra en la documentación del prototipo: http://www.prototypejs.org/api/array – OverloadUT

+1

Además, no creo que sea un duplicado porque estaba buscando una solución de prototipo nativo 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 cuidado: se desaconseja iterar sobre las propiedades de las matrices, no de los objetos simples – Christoph

546

no hay necesidad de Prototipo aquí: JavaScript tiene for..in bucles. Si no está seguro de que nadie se metía con Object.prototype, comprobar hasOwnProperty() así, es decir,

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

Gracias por la respuesta real sin forzarnos a cargar una biblioteca no deseada. –

+8

esta no es la respuesta correcta. ¡las preguntas dicen que el prototipo debe ser usado! libertad de elección - jaja ... –

+11

+1 Es la respuesta correcta al título de la pregunta. –

Cuestiones relacionadas