【问题标题】:Iterate over ES6 Set/Map in Coffeescript (with `of` operator)在 Coffeescript 中迭代 ES6 Set/Map(使用 `of` 运算符)
【发布时间】:2014-12-30 10:29:17
【问题描述】:

如何在 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() 来编写自己的自定义迭代器,但那将是可憎的。 :)

【问题讨论】:

  • 我不认为你真的可以。您可以使用高阶函数,它无需调用括号,几乎与本机语法一样干净。
  • @dandavis:你的意思是例如s.forEach (x) -> console.log(x)?
  • 是的,类似的,您可能需要自己的函数来处理对象/集输入...

标签: javascript coffeescript ecmascript-6


【解决方案1】:

目前无法使用来自 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)

【讨论】:

  • 在第一行中,您的意思是说“新的 JavaScript ES6 of 运算符”吗?
  • 请注意of 使用迭代器的方式略有不同。它有一个隐含的try finally,如果循环体过早返回,它会调用i.return()
  • 是的 - 修复了对 of 运算符的引用(谢谢!)。迷人,@Bergi
  • 这不再正确。您能否编辑以添加注释。咖啡脚本 2.0? coffeescript.org/announcing-coffeescript-2
【解决方案2】:

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) { }`

【讨论】:

    【解决方案3】:

    你想做这样的事情:

    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
    

    【讨论】:

    • 我认为您误读了这个问题。使用您的示例,需要工作的是eat food for food in new Set(['toast', 'cheese', 'wine']),它失败了,因为CoffeeScript 将其转换为for 循环。 ES6 Set 既没有length 属性也没有索引。
    • 我确实误读了它。感谢您的澄清。看起来集合还没有进入 Coffeescript。不过,您也许可以使用下划线或 lodash 来解决这个问题。见我的编辑,上面
    • 感谢@Ashwin——另一个选项是问题的 cmets (s.forEach (x) -> ...)。如果我看到任何进一步说明的内容,我会发布。
    • 完全没问题。如果您使用纯 JS,s.forEach() 效果很好,但 s = new Set() 行会在 Coffeescript 中引发 ReferenceError。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-27
    • 2023-01-16
    • 1970-01-01
    • 2015-12-19
    • 2022-12-02
    • 2017-03-03
    • 1970-01-01
    相关资源
    最近更新 更多