如何在CoffeeScript中的对象上迭代键和值?


189

我有一个对象(可以说是“关联数组”,也称为纯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中做到这一点?


4
JavaScript / CoffeeScript中的“数组”是具有数字索引的特殊对象,并且是length仅引用最高数字索引(加1)的属性。您想要的只是一个“对象”:obj = {}。数组是对象,但是在您的示例中没有理由使用数组。
Trevor Burnham

1
好点特雷弗!我已经修改了这个问题,以减少这方面的误导/混淆。
Per Lundberg

Answers:


350

使用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 agesAaron Dufour在评论中提到的变体。这将添加检查以排除从原型继承的属性,在此示例中这可能不是问题,但如果您是在其他内容之上构建,则可能会出现问题。


12
恰恰。CoffeeScript的of编译为JavaScript的in。这是一个常见的混淆点,但是in与数组一起使用非常有用。我在CoffeeScript书中详细讨论了这一点。
Trevor Burnham

3
您不应该初始化arrarr = [],而应该使用arr = {}。在Javascript(和Coffeescript)中,数组具有数字索引。对象的行为类似于关联数组/字典。
摩根·哈里斯

谢谢,这已经由Trevor和其他人指出,我的回答是保留原始的问题代码。无论如何,我将更新示例以使用纯对象。
尼克

13
尽管对于此特定示例而言并不重要,但听起来似乎for own key, value of obj更接近于OP寻找的对象。
亚伦·迪富

4

您正在初始化一个数组,但是随后您像一个对象一样使用它(js中没有“关联数组”)。

使用语法遍历对象(类似):

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

3
实际上,JS中的所有对象都是关联数组(没有一致的键顺序)。因此,代码jcmoney了应工作,虽然没有理由使用[],而不是{}在这种情况下。
Trevor Burnham

jashkenas.github.com/coffee-script/#loops看起来由coffeescript生成的循环不会遍历对象成员。
kioopi

3

使用数组理解的简写版本,可以用作单行循环。

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

数组理解为:

““综合用可选的保护子句和当前数组索引的值替换(并编译成)for循环。与for循环不同,数组综合是表达式,可以返回并分配。”, http://coffeescript.org/ #循环


5
请解释。仅提供代码段是不够的。stackoverflow并非“编解码器”网站,其想法是,如果答案能澄清抽象概念,其他人将受益更多。
伊莱兰·马尔卡

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 key, val of arr
  console.log key + ': ' + val

返回:

Foo : Bar
Bar : Foo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.