在Coffeescript中迭代ES6 Set / Map(使用`of`运算符)

时间:2014-11-03 17:39:35

标签: javascript coffeescript ecmascript-6

如何在Coffeescript中迭代ES6 MapSet

在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()上骑自行车来编写自己的自定义迭代器,但这可能是令人厌恶的。 :)

3 个答案:

答案 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)

Coffeescript 2.0 - for …from

  

现在可以使用Coffee的for …from(我们已经拥有for …of):for n from generatorFunction()

Coffeescript 1.0 - Backticks

一种选择是使用反引号嵌入原始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