我有一个对象(一个“关联数组”,也就是说 - 也称为普通的JavaScript对象):
obj = {}
obj["Foo"] = "Bar"
obj["bar"] = "Foo"
我想使用CoffeeScript迭代obj
,如下所示:
# CS
for elem in obj
上面的CS代码编译成JS:
// JS
for (i = 0, len = obj.length; i < len; i++)
在这种情况下不合适。
JavaScript的方式是for(var key in obj)
,但现在我想知道:我怎样才能在CoffeeScript中执行此操作?
答案 0 :(得分:347)
使用for x,y of L
。 Relevant documentation
ages = {}
ages["jim"] = 12
ages["john"] = 7
for k,v of ages
console.log k + " is " + v
输出
jim is 12
john is 7
您可能还想在评论中考虑Aaron Dufour提到的变体for own k,v of ages
。这会添加一个检查以排除从原型继承的属性,这可能不是本例中的问题,但可能是在构建其他东西之上。
答案 1 :(得分:4)
你正在初始化一个数组,但是你像对象一样使用它(js中没有“关联数组”)。
使用语法迭代对象(类似):
for key, val of arr
console.log key + ': ' + val
答案 2 :(得分:2)
使用数组理解的短手版本,可以用作单行循环。
console.log index + ": " + elm for index, elm of array
数组理解是:
“comprehensions替换(并编译成)for循环,可选 guard子句和当前数组索引的值。与...不同 循环,数组理解是表达式,可以返回和 分配“, http://coffeescript.org/#loops
答案 3 :(得分:1)
使用您的约定,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 data in array”
for key, val of arr
console.log key + ': ' + val
返回:
Foo : Bar
Bar : Foo