2012-08-07 28 views
97

Duplicar posibles:
Iterate over Object Literal Values¿Cada uno para el objeto?

tengo objeto en JavaScript:

var object = someobject; 

Object { aaa=true, bbb=true, ccc=true } 

¿Cómo puedo utilizar cada uno para esto?

object.each(function(index, value)) { 
     console.log(value); 
} 

No funciona.

+0

http://stackoverflow.com/questions/921789/how-to-loop-through-javascript-object-literal-with-objects-as- miembros –

+0

¿Estás usando jQuery? ¿Qué resultado esperas? Tres "verdaderos" en la consola? – davids

+0

La documentación de jQuery de $ .each (http://api.jquery.com/jQuery.each/) tiene un ejemplo perfecto: vea el segundo bloque de código en la página. Utiliza alert() en lugar de console.log(). – Faust

Respuesta

255

Un objeto de JavaScript no tiene una función .each estándar. jQuery proporciona una función. Ver http://api.jquery.com/jQuery.each/ La continuación deben trabajar

$.each(object, function(index, value) { 
    console.log(value); 
}); 

Otra opción sería el uso de JavaScript básico mediante el Object.keys() y la matriz de .map() funciones como esto

Object.keys(object).map(function(objectKey, index) { 
    var value = object[objectKey]; 
    console.log(value); 
}); 

Ver https://developer.mozilla.org/nl/docs/Web/JavaScript/Reference/Global_Objects/Object/keys y https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

Estos son generalmente mejores que usar Javascript vainilla for-loop, a menos que realmente entiendas las implicaciones de usar un for-loop normal y ver el uso para su específico características como bucle sobre la cadena de propiedades.

Pero, por lo general, un bucle for no funciona mejor que jQuery o Object.keys().map(). Voy a entrar en dos problemas potenciales con el uso de un simple for-loop a continuación.


derecho, por lo que también destacó en otras respuestas, una alternativa Javascript normal sería

for(var index in object) { 
    var attr = object[index]; 
} 

Hay dos posibles problemas con este:

1. Desea verificar si el atributo que está buscando proviene del objeto en sí y no de la cadena del prototipo. Esto se puede comprobar con la función hasOwnProperty al igual que

for(var index in object) { 
    if (object.hasOwnProperty(index)) { 
     var attr = object[index]; 
    } 
} 

Ver https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty para más información.

Las funciones jQuery.each y Object.keys se encargan de esto automáticamente.

2. Otro problema potencial con un ciclo cerrado es el del alcance y los no cierres. Esto es un poco complicado, pero tome por ejemplo el siguiente código. Tenemos un montón de botones con los identificadores de Button0, el botón 1, button2 etc, y queremos establecer un onclick en ellos y hacer un console.log así:

<button id='button0'>click</button> 
<button id='button1'>click</button> 
<button id='button2'>click</button> 

var messagesByButtonId = {"button0" : "clicked first!", "button1" : "clicked middle!", "button2" : "clicked last!"]; 
for(var buttonId in messagesByButtonId) { 
    if (messagesByButtonId.hasOwnProperty(buttonId)) { 
     $('#'+buttonId).click(function() { 
      var message = messagesByButtonId[buttonId]; 
      console.log(message); 
     }); 
    } 
} 

Si, después de algún tiempo, hacemos clic en cualquiera de los botones siempre seremos "cliqueados al último" en la consola, y nunca "hizo clic primero" o "clicked middle!" ¿Por qué?Porque en el momento en que se ejecuta la función onclick, se mostrará messagesByButtonId[buttonId] usando la variable buttonIden ese momento. Y dado que el ciclo ha finalizado en ese momento, la variable buttonId seguirá siendo "button2" (el valor que tenía durante la última iteración del bucle), por lo que messagesByButtonId[buttonId] será messagesByButtonId["button2"], es decir, "¡hizo clic en último lugar!".

Consulte https://developer.mozilla.org/en-US/docs/Web/JavaScript/Closures para obtener más información sobre cierres. Especialmente la última parte de esa página que cubre nuestro ejemplo.

Una vez más, jQuery.each y Object.keys().map() resolver este problema de forma automática para nosotros, ya que nos proporciona una function(index, value) (que tiene el cierre) por lo que son seguros de usar tanto el índice y el valor y estar seguro de que tienen el valor que esperamos.

+3

La "opción más fácil" no fue provista por usted, simplemente diciendo – Alexander

+1

Cierto, la edité más adelante. Editado para dejar eso en claro. –

+2

"más fácil" no es siempre el "mejor", así que ... – Juan

58
for(var key in object) { 
    console.log(object[key]); 
} 
+0

gracias, pero esto me devuelve" verdadero ", en lugar de aaa, bbb, ccc :( –

+3

sí, eso es lo que es priting para consolar el valor de los atributos que es verdadero para cada clave, si quieres ver aaa, bbb, ccc luego use 'console.log (clave);' –

+13

Tenga en cuenta que es posible que desee comprobar si la clave encontrada proviene del objeto mismo o de la cadena del prototipo. Use object.hasOwnProperty (clave) para verificar que –

-1

var object = { "a": 1, "b": 2}; 
 
$.each(object, function(key, value){ 
 
    console.log(key + ": " + object[key]); 
 
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script>

//output 
a: 1 
b: 2 
+4

¡Esto está INCORRECTO! $ .each es JQuery-Framework! – raiserle

+1

esto depende de jquery. ¿Tienes una solución sin jQuery? –

+2

debe agregar un título a su respuesta especificando que es jQuery dependiente – davidtaubmann

Cuestiones relacionadas