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

我有一个对象(也就是所谓的“关联数组”——也称为普通的 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 中做到这一点?

101461 次浏览

你初始化了一个数组,但是你把它当做一个对象来使用(js 中没有“关联数组”)。

使用在对象上迭代的语法(类似于) :

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

使用 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

你也可以考虑一下 Aaron Dufour 在评论中提到的变体 for own k,v of ages。这将添加一个检查以排除从原型继承的属性,这在本例中可能不是一个问题,但是如果在其他内容之上构建,则可能会出现问题。

使用数组理解的简短版本,它可以作为一个单行循环使用。

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

数组理解是:

”理解替换(并编译成) for 循环,使用可选的 子句和当前数组索引的值 循环,数组理解是表达式,可以返回和 分配。」, Http://coffeescript.org/#loops

根据您的约定,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 value in array”

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

返回:

Foo : Bar
Bar : Foo