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

jhc*_*hen 189 javascript coffeescript

我有一个对象(一个"关联数组",也就是说 - 也称为普通的JavaScript对象):

obj = {}
obj["Foo"] = "Bar"
obj["bar"] = "Foo"
Run Code Online (Sandbox Code Playgroud)

我想迭代obj使用CoffeeScript,如下所示:

# CS
for elem in obj
Run Code Online (Sandbox Code Playgroud)

上面的CS代码编译成JS:

// JS
for (i = 0, len = obj.length; i < len; i++)
Run Code Online (Sandbox Code Playgroud)

这种情况不合适.


JavaScript的方式会是,for(var key in obj)但现在我想知道:我怎么能在CoffeeScript中做到这一点?

Nic*_*ick 349

使用for x,y of L.相关文件.

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

for k,v of ages
  console.log k + " is " + v
Run Code Online (Sandbox Code Playgroud)

输出

jim is 12
john is 7
Run Code Online (Sandbox Code Playgroud)

您可能还想for own k,v of ages在评论中考虑Aaron Dufour提到的变体.这会添加一个检查以排除从原型继承的属性,这可能不是本例中的问题,但可能是在构建其他东西之上.

  • 虽然对于这个特定的例子并不重要,但它听起来像`对于自己的密钥,obj`的值更接近于OP正在寻找的东西. (13认同)
  • 正是.CoffeeScript的`of`编译为JavaScript的`in`.这是一个常见的混淆点,但使用`in`与数组一起使用是非常有用的.我在[CoffeeScript书](http://pragprog.com/titles/tbcoffee/coffeescript)中详细讨论了这个问题. (12认同)
  • 你不应该将`arr`初始化为`arr = []`,你应该使用`arr = {}`.在Javascript(和Coffeescript)数组中有数字索引.对象的行为类似于关联数组/ dicts. (3认同)