如何在Coffeescript中迭代ES6 Map或Set?
在Javascript中,人们会使用例如。
s = new Set()
s.add({a: 1})
for (x of s) {
console.log(x);
}
然而,Coffeescript有自己的of
运算符转换为in
,即:
console.log(x) for x of s
变为... for (x in s) { ... }
。
如何在Coffeescript中访问Javascript的of
运算符?
可以通过在s.values().next()
上骑自行车来编写自己的自定义迭代器,但这可能是令人厌恶的。 :)
答案 0 :(得分:8)
目前无法使用coffeescript中的新Javascript ES6 of
运算符(截至1.9.2)。目前最好的选择是使用上面提到的s.forEach (x) -> ...
或m.forEach (value, key) ->
。
对于一组:
s = new Set
s.add {a: 1}
s.forEach (v) =>
console.log v
对于地图:
m = new Map
m.set {a: 1}, {b: 2}
m.forEach (v, k) =>
console.log k, v
如果您想避免因任何原因创建新函数,可以直接使用coffeescript中的迭代器。但它有点讨厌。套装:
i = s.values()
while(v = i.next(); !v.done)
console.log v.value
对于地图:
i = m.entries()
while(v = i.next(); !v.done)
[key, value] = v.value
console.log key, value
while循环上的括号是使while循环依赖于v.done所必需的。
它们也可以在一行上完成 - 但看起来非常糟糕:
i = s.values(); console.log v.value while(v = i.next(); !v.done)
答案 1 :(得分:2)
for …from
现在可以使用Coffee的
for …from
(我们已经拥有for …of
):for n from generatorFunction()
一种选择是使用反引号嵌入原始Javascript,即http://coffeescript.org/#embedded。
`for (x of y) { }`
答案 2 :(得分:1)
你想做这样的事情:
eat food for food in ['toast', 'cheese', 'wine']
(其中eat
是一个函数)
在你的情况下,你会这样做:
console.log(x) for x in s
参考:http://coffeescript.org/#loops
使用coffeescript REPL很有帮助。您可以在控制台中键入coffee
来打开它。请尝试以下代码:
_ = require 'underscore' #substitute underscore for lodash, if you prefer
s = ["a", "b", "c"]
console.log(x) for x in s
编辑:
不幸的是,ES6的Set功能似乎还没有进入Coffeescript。考虑使用下划线lodash方法_.unique()
或_.union()
来模仿您正在寻找的功能。
对于上面的示例:
s = _.unique ["a", "a", "b", "b", "b", "c"]
console.log(x) for x in s