2012-06-14 10 views
24

Tło: Próbuję przekonwertować niektóre kodu JavaScript, który wykorzystuje bibliotekę Crossfilter z D3.js wizualizacji danych biblioteki do CoffeeScript.Jak przekonwertować JavaScript foreach pętli/funkcję coffeescript

Jaki jest najlepszy sposób na przekonwertowanie kodu JavaScript do pętli/funkcji do CoffeeScript?

Oto kod 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; 
}); 

Czy coffeescript zrobić funkcję in-line wewnątrz pętli? Teraz mam zgadywać muszę to podzielone na funkcję i pętli:

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

coerce(flights) for d in flights 

Odpowiedz

35

użyć zrozumieniem

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

Powyższy kod przekłada się

var d, i, _i, _len; 

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

więc widzę d i i są tym, czym chcesz je mieć.

Go here i wyszukaj "forEach" dla niektórych przykładów.

Na koniec spójrz na pierwszy komentarz, aby uzyskać więcej przydatnych informacji.

+4

Tak OP wie, to nie jest odpowiednik kodu JS. To będzie iterować nad niezadeklarowanymi właściwościami, podczas gdy 'forEach' nie będzie. Ponadto nie tworzy nowego zamknięcia podczas każdej iteracji, więc jeśli są utworzone procedury obsługi, mogą nie zachowywać się zgodnie z oczekiwaniami. –

+1

świetny dodatek, thanx – hvgotcodes

11

bezpośredni przekład brzmi:

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

lub można użyć idiomatyczne wersję:

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

To wydaje się powodować pętlę 'for'. "ForEach" ma subtelne * (lub może nie tak subtelne) * różnice. –

+0

Mówiłem WRT drugą wersję. +1 dla pierwszego, który jest właściwym odpowiednikiem. Nie pamiętam, czy to tam było, skomentowałem. –

3

forEach ma tę zaletę, że owinięcie każdej iteracji w zamknięciu. więc asynchroniczne połączenia mogą zachować poprawne wartości. coffeescript sposób to zrobić (bez faktycznie przy użyciu foreach) jest

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

to kompiluje się do czegoś bardzo podobnego do próbki PO za:

_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); 
} 

Użyj tego jeśli trzeba < IE9 poparcie (forEach obsługiwanym w IE począwszy od wersji 9)