Итерация над объектом в 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