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?

Author: Nick, 2011-06-20

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.

 338
Author: Nick,
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 
 4
Author: kioopi,
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

 2
Author: sqren,
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
 1
Author: Benibur,
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