Итерация над объектом в coffeescript

У меня есть объект ( "ассоциированный массив", также известный как простой объект Javascript):

obj = {}
obj["Foo"] = "Bar"
obj["bar"] = "Foo"

и мне нужно перебрать его с помощью coffeescript. Теперь сделаем вот так:

for elem in obj

не работает, поскольку obj.length равно 0, которое использует код компиляции js. В обычном Javascript я бы просто сделал

for(var key in obj)

но теперь мне интересно: как я могу сделать это в coffeescript?

Ответ 1

Используйте for x,y of L. Соответствующая документация.

ages = {}
ages["jim"] = 12
ages["john"] = 7

for k,v of ages
  console.log k + " is " + v

Выходы

jim is 12
john is 7

Вы также можете рассмотреть вариант for own k,v of ages, как упоминал Аарон Дюфур в комментариях. Это добавляет проверку для исключения свойств, унаследованных от прототипа, что, вероятно, не является проблемой в этом примере, но может быть, если вы строите поверх других вещей.

Ответ 2

Вы инициализируете массив, но тогда вы используете его как объект (в js нет "ассоциативного массива" ).

Используйте синтаксис для итерации над объектами (что-то типа):

for key, val of arr
  console.log key + ': ' + val 

Ответ 3

Краткосрочная версия, использующая понимание массива, которая может использоваться как однострочный цикл.

console.log index + ": " + elm for index, elm of array

Массивное понимание:

"Понятия заменяют (и компилируются) на циклы, с необязательным защитные предложения и значение текущего индекса массива. В отличие от циклы, методы массива являются выражениями и могут быть возвращены и назначен.", http://coffeescript.org/#loops

Ответ 4

с вашим соглашением, arr является массивом, но "foo" является свойством этого массива, это не индексированное значение. Если вы хотите сохранить ваши данные индексированными значениями массива, вы должны были написать:

arr1 = []
arr1[0] = "Bar"
arr1[1] = "Foo"

или если вам нужен ассоциативный массив, просто используйте объект:

arr2 = {}
arr2["Foo"] = "Bar" // equivalent to arr2.foo="Bar"
arr2["bar"] = "Foo" // equivalent to arr2.bar="Foo"

если вы хотите выполнить цикл над arr1:

str = "values are : "
for val in arr2
  str += val + " |"
console.log key + ': ' + val

возвращает:

values are : Bar | Foo |

и зацикливать на arr2: "для значения в массиве"

for key, val of arr
  console.log key + ': ' + val

который возвращает:

Foo : Bar
Bar : Foo