Iterar sobre el objeto en coffeescript
Tengo un objeto (un" array asociado", también conocido como un objeto Javascript plano):
obj = {}
obj["Foo"] = "Bar"
obj["bar"] = "Foo"
Y necesito iterar sobre él usando coffeescript. Ahora, haciendo así:
for elem in obj
No funciona porque obj.la longitud es 0, que el código js de compilación utiliza. En Javascript normal solo haría
for(var key in obj)
Pero ahora me pregunto: ¿cómo puedo hacer esto en coffeescript?
4 answers
Use for x,y of L
. documentación Pertinente.
ages = {}
ages["jim"] = 12
ages["john"] = 7
for k,v of ages
console.log k + " is " + v
Salidas
jim is 12
john is 7
Es posible que también desee considerar la variante for own k,v of ages
como se menciona por Aaron Dufour en los comentarios. Esto agrega una comprobación para excluir propiedades heredadas del prototipo, lo que probablemente no sea un problema en este ejemplo, pero puede serlo si está compilando sobre otras cosas.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-04 08:40:53
Está inicializando un array, pero luego lo está usando como un objeto (no hay un "array asociativo" en js).
Use la sintaxis para iterar sobre objetos (algo así como):
for key, val of arr
console.log key + ': ' + val
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-06-20 08:51:42
La versión de mano corta usando comprensión de matriz, que se puede utilizar como un bucle de una línea.
console.log index + ": " + elm for index, elm of array
Comprensión de matriz son:
" Comprehensions reemplazar (y compilar en) bucles for, con opcional cláusulas guard y el valor del índice de matriz actual. A diferencia de bucles, comprensiones de matriz son expresiones, y se pueden devolver y asignar.", http://coffeescript.org/#loops
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-14 00:21:22
Con su convención, arr es un array, pero "foo" es una propiedad de este array, no es un valor indexado. Si desea almacenar sus datos los valores indexados de una matriz, debería haber escrito:
arr1 = []
arr1[0] = "Bar"
arr1[1] = "Foo"
O si desea una matriz asociativa, simplemente use un objeto:
arr2 = {}
arr2["Foo"] = "Bar" // equivalent to arr2.foo="Bar"
arr2["bar"] = "Foo" // equivalent to arr2.bar="Foo"
Si quieres hacer un bucle sobre arr1:
str = "values are : "
for val in arr2
str += val + " |"
console.log key + ': ' + val
Devuelve:
values are : Bar | Foo |
Y para hacer un bucle sobre arr2:"for value in array"
for key, val of arr
console.log key + ': ' + val
Que devuelve:
Foo : Bar
Bar : Foo
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-09-07 00:26:37