2012-06-14 113 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的起始版本中)

相關問題