2012-06-14 80 views
24

背景:我试图将一些使用Crossfilter库的JavaScript代码与D3.js数据可视化库转换为CoffeeScript我如何将JavaScript forEach循环/函数转换为CoffeeScript

将JavaScript forEach循环/函数转换为CoffeeScript的最佳方法是什么?

这里的JavaScript代码:

// A little coercion, since the CSV is untyped. 
flights.forEach(function(d, i) { 
    d.index = i; 
    d.date = parseDate(d.date); 
    d.delay = +d.delay; 
    d.distance = +d.distance; 
}); 

能CoffeeScript中做一个循环内的内联函数?现在,我想我需要它分解成一个功能和循环:

coerce = (d) -> 
    d.index = 1 
    d.date  = parseDate(d.date) 
    d.delay = +d.delay 
    d.distance = +d.distance 

coerce(flights) for d in flights 

回答

35

使用理解

for d, i in flights 
    console.log d, i 

上面的代码转换为

var d, i, _i, _len; 

for (i = _i = 0, _len = flights.length; _i < _len; i = ++_i) { 
    d = flights[i]; 
    console.log(d, i); 
} 

所以你可以看到di是你想要的。

Go here并且在一些示例中搜索“for each”。

最后,查看第一条评论以获取更多有用信息。

+4

就这样OP知道,这不等同于JS代码。它会遍历未声明的属性,而'forEach'则不会。此外,它不会在每次迭代过程中创建新的闭包,因此如果创建了处理程序,它们可能不会按预期运行。 – 2012-06-14 16:15:30

+1

很好的补充,thanx – hvgotcodes

11

直接翻译是:

flights.forEach (d, i) -> 
    d.index = i 
    d.date = parseDate(d.date) 
    d.delay = +d.delay 
    d.distance = +d.distance 

,或者您可以使用惯用的版本:

for d,i in flights 
    d.index = i 
    d.date = parseDate(d.date) 
    d.delay = +d.delay 
    d.distance = +d.distance 
+1

这似乎导致'for'循环。一个'forEach'具有微妙的*(或者不那么微妙)差异。 – 2012-06-14 15:55:21

+0

我在说WRT的第二个版本。第一个+1,这是相当的。当我评论时,我不记得是否在那里。 – 2012-06-14 16:17:22

3

的forEach在封闭包裹每次迭代的优势。所以异步调用可以保留正确的值。 做这个(没有实际使用的forEach)的CoffeeScript的方式是

for d,i in flights 
    do (d, i)-> 
    d.index = i 
    d.date = parseDate(d.date) 
    d.delay = +d.delay 
    d.distance = +d.distance 

这个编译非常相似,OP的样品东西:

_fn = function(d, i) { 
    d.index = i; 
    d.date = parseDate(d.date); 
    d.delay = +d.delay; 
    return d.distance = +d.distance; 
}; 
for (i = _i = 0, _len = flights.length; _i < _len; i = ++_i) { 
    d = flights[i]; 
    _fn(d, i); 
} 

使用这个,如果你需要< IE9支持(的forEach支持在IE 9的起始版本中)

相关问题