对象数组的Coffeescript迭代不按预期编译

时间:2015-05-26 19:41:18

标签: coffeescript

我想对一组对象执行迭代。而不是写

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

出于问题的原因,假设密钥是动态的

1 个答案:

答案 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