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 buttonId
en 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.
http://stackoverflow.com/questions/921789/how-to-loop-through-javascript-object-literal-with-objects-as- miembros –
¿Estás usando jQuery? ¿Qué resultado esperas? Tres "verdaderos" en la consola? – davids
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