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

Bri*_*unt 14 javascript coffeescript ecmascript-6

如何在Coffeescript中迭代ES6 MapSet

在Javascript中,人们可以使用例如

s = new Set()
s.add({a: 1})
for (x of s) {
  console.log(x);
}
Run Code Online (Sandbox Code Playgroud)

但是Coffeescript有自己的of运算符转换为in,即:

console.log(x) for x of s
Run Code Online (Sandbox Code Playgroud)

成为... for (x in s) { ... }.

如何of在Coffeescript中访问Javascript的运算符?

人们可以通过骑自行车来编写自己的自定义迭代器s.values().next(),但那可能是令人厌恶的.:)

Jos*_*eph 9

目前无法使用ofcoffeescript 的新Javascript ES6 运算符(截至1.9.2).现在最好的选择是使用s.forEach (x) -> ...m.forEach (value, key) ->如上所述.

对于一组:

s = new Set
s.add {a: 1}

s.forEach (v) =>
  console.log v
Run Code Online (Sandbox Code Playgroud)

对于地图:

m = new Map
m.set {a: 1}, {b: 2}

m.forEach (v, k) =>
  console.log k, v
Run Code Online (Sandbox Code Playgroud)

如果您想避免出于任何原因创建新函数,可以直接从coffeescript使用迭代器.但它有点讨厌.套装:

i = s.values()
while(v = i.next(); !v.done)
  console.log v.value
Run Code Online (Sandbox Code Playgroud)

对于地图:

i = m.entries()
while(v = i.next(); !v.done)
  [key, value] = v.value
  console.log key, value
Run Code Online (Sandbox Code Playgroud)

while循环上的括号是使while循环依赖于v.done所必需的.

它们也可以在一行上完成 - 但它看起来很糟糕:

i = s.values(); console.log v.value while(v = i.next(); !v.done)
Run Code Online (Sandbox Code Playgroud)


Bri*_*unt 5

Coffeescript 2.0for …from

JavaScript 的 for...of 现在可以作为 CoffeeScript 的for …from(我们已经有了for …of):for n from generatorFunction()

Coffeescript 1.0 — 反引号

一种选择是使用反引号嵌入原始 Javascript,即http://coffeescript.org/#embedded

`for (x of y) { }`
Run Code Online (Sandbox Code Playgroud)