Javascript 在Coffeescript中迭代ES6集合/映射(使用`of`运算符)
如何在ES6或Coffeescript中进行迭代 在Javascript中,可以使用Javascript 在Coffeescript中迭代ES6集合/映射(使用`of`运算符),javascript,coffeescript,ecmascript-6,Javascript,Coffeescript,Ecmascript 6,如何在ES6或Coffeescript中进行迭代 在Javascript中,可以使用 s = new Set() s.add({a: 1}) for (x of s) { console.log(x); } 但是,Coffeescript有自己的of操作符,在中转换为,即: console.log(x) for x of s 变成。。。对于(s中的x){…} 如何在Coffeescript中访问Javascript的操作符的 人们可以通过循环使用s.values().next()来编写自
s = new Set()
s.add({a: 1})
for (x of s) {
console.log(x);
}
但是,Coffeescript有自己的of
操作符,在中转换为,即:
console.log(x) for x of s
变成。。。对于(s中的x){…}
如何在Coffeescript中访问Javascript的
操作符的
人们可以通过循环使用
s.values().next()
来编写自己的自定义迭代器,但这是一个令人讨厌的问题 您希望执行以下操作:
eat food for food in ['toast', 'cheese', 'wine']
(其中,eat
是一个函数)
在您的情况下,您将执行以下操作:
console.log(x) for x in s
参考:
使用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。考虑使用下划线的方法:<代码> > .UNIQUE()/<代码>或<代码> > UNION()>代码>模拟您正在寻找的功能。
对于上述示例:
s = _.unique ["a", "a", "b", "b", "b", "c"]
console.log(x) for x in s
目前无法使用coffeescript(从1.9.2开始)中的新Javascript ES6
of
操作符。目前最好的选择是使用上面提到的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
i = m.entries()
while(v = i.next(); !v.done)
[key, value] = v.value
console.log key, value
如果您想避免出于任何原因创建新函数,可以直接从coffeescript使用迭代器。但这有点恶心。对于集合:
i = s.values()
while(v = i.next(); !v.done)
console.log v.value
对于地图:
m = new Map
m.set {a: 1}, {b: 2}
m.forEach (v, k) =>
console.log k, v
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)
-用于…从
for…of的JavaScript现在可以作为CoffeeScript的for…from
(我们已经有一个for…of
):for n from generatorFunction()
Coffeescript 1.0-Backticks
一个选项是使用backtick来嵌入原始Javascript,即
我认为你真的不能。您可以使用一个高阶函数,它没有参数可调用,几乎和本机语法一样干净。@dandavis:您的意思是,例如
s.forEach(x)->console.log(x)
?是的,类似的,您可能需要自己的函数来处理对象/设置输入……相关:我想您误读了这个问题。使用您的示例,需要工作的是在新的集合中以食物换食物(['toast'、'cheese'、'wine'])
,这会失败,因为CoffeeScript将其转换为for
循环。ES6集合既没有length
属性,也没有索引。事实上,我误读了它。谢谢你的澄清。看起来布景还没有进入咖啡脚本。不过,您可能可以使用下划线或lodash来解决这个问题。请参见我的编辑,谢谢@Ashwin——另一个选项在问题的注释中(s.forEach(x)->…
)。我会张贴,如果我看到任何进一步照亮。没有问题<如果使用纯JS,code>s.forEach()工作得很好,但是s=new Set()
行将在Coffeescript中抛出一个引用错误。在第一行中,您的意思是说“新的JavaScript ES6of
操作符”?注意of
以一种稍微不同的方式使用迭代器。它有一个隐式的try finally
,如果循环体过早返回,它将调用i.return()。令人着迷的是,@BergiThis不再正确。请您编辑以添加注释。咖啡脚本2.0?