Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/422.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Coffeescript中迭代ES6集合/映射(使用`of`运算符)_Javascript_Coffeescript_Ecmascript 6 - Fatal编程技术网

Javascript 在Coffeescript中迭代ES6集合/映射(使用`of`运算符)

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()来编写自

如何在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()
来编写自己的自定义迭代器,但这是一个令人讨厌的问题

您希望执行以下操作:

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 ES6
of
操作符”?注意
of
以一种稍微不同的方式使用迭代器。它有一个隐式的
try finally
,如果循环体过早返回,它将调用
i.return()。令人着迷的是,@BergiThis不再正确。请您编辑以添加注释。咖啡脚本2.0?