我想对一组对象执行迭代。而不是写
for item in items
for k, v in item
# Do Something
我想做类似的事情
for k,v of item in items
# Do something
不支持基于编译输出的内容:
var k, ref, ref1, v, indexOf = [].indexOf || function(item) { for (var i = 0, l = this.length; i < l; i++) { if (i in this && this[i] === item) return i; } return -1; };
ref1 = (ref = indexOf.call(items, item) >= 0) != null ? ref : [];
for (k in ref1) {
v = ref1[k];
# Do something
}
是否还有其他可以理解的操作来执行此快捷方式?
编辑:我可以通过
来引用对象中的特定键for { k1, k2 }, i in items
# Do something
出于问题的原因,假设密钥是动态的
答案 0 :(得分:0)
不,你不能。遵循coffeescript的黄金法则“它只是JavaScript”,请考虑查看at the source where a for
loop gets translated。您需要两个Javascript for
,并且只能从coffescript for
获取一个(for
插入第2079行)。
你想要的javascript结果是这样的:
for(_i…;…;…){
var _x = items[_i];
for(k in _x){
var v = _x[k]
…
}}
只有两种方法可以获得javascript for
循环(除了预先编写的循环外,就像在类定义中一样):在“Range compilation”上,它总是提供一个for(…;…;…)
循环(其中在将要返回的闭包内构造一个数组,并为for
构造构造。
访问单个密钥的示例有效,因为您正在使用一些非常特殊的解构分配案例。你需要的是一个提取键值对的解构,没有。如果你看一下像这样编译过的示例构造,就会被翻译成a=items[i].a
,这样就没有迭代了。您甚至可以省略,i
:
for {a} in items
#iterate over the .a values of items
如果您的#Do something
只是一行,您可以将for
放在一行,但我个人认为这不会增加可读性。
console.log [k,v] for k,v of i for i in items