it-swarm.com.ru

Как перебрать ключи и значения в объекте в CoffeeScript?

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

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

Я хочу перебрать obj, используя CoffeeScript следующим образом:

# CS
for elem in obj

бу код CS выше компилируется в JS:

// JS
for (i = 0, len = obj.length; i < len; i++)

что не подходит в этом случае.


Путь JavaScript был бы for(var key in obj), но теперь мне интересно: как я могу сделать это в CoffeeScript?

186
jhchen

Используйте 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, как упомянуто Аароном Дюфуром в комментариях. Это добавляет проверку для исключения свойств, унаследованных от прототипа, что, вероятно, не является проблемой в этом примере, но может быть, если вы строите поверх других вещей.

347
Nick

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

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

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

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

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

Массивом понимания являются:

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

2
sqren

согласно вашему соглашению 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
1
Benibur