2012-06-14 6 views
24

Sfondo: Sto cercando di convertire un codice JavaScript che usa la biblioteca Crossfilter con la libreria di visualizzazione dei dati in D3.jsCoffeeScript.Come faccio a convertire un loop/funzione JavaScript forEach a CoffeeScript

Qual è il modo migliore per convertire un JavaScript per ogni loop/funzione in CoffeeScript?

Ecco il codice 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; 
}); 

Può CoffeeScript fare una funzione in-line all'interno di un ciclo? In questo momento sto che ho bisogno è scoppiata in una funzione e ciclo:

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

coerce(flights) for d in flights 

risposta

35

utilizzare un comprensione

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

Il codice si traduce qui sopra per

var d, i, _i, _len; 

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

in modo da vedere d e i sono ciò che volete che siano.

Go here e cercare "forEach" per alcuni esempi.

Infine, guarda il primo commento per alcune informazioni più utili.

+4

Solo così OP sa, questo non è equivalente al codice JS. It iterà su proprietà non dichiarate, mentre un 'forEach' no. Inoltre, non crea una nuova chiusura durante ogni iterazione, quindi se ci sono gestori creati, potrebbero non comportarsi come previsto. –

+1

ottima aggiunta, grazie – hvgotcodes

11

La traduzione diretta è:

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

oppure è possibile utilizzare una versione idiomatica:

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

Sembra che il risultato sia un ciclo 'for'. Un 'forEach' ha differenze * sottili (o forse non così sottili) *. –

+0

stavo parlando WRT la seconda versione. +1 per il primo, che è l'equivalente corretto. Non ricordo se fosse lì quando ho commentato. –

3

forEach ha il vantaggio di avvolgere ogni iterazione in una chiusura. così le chiamate asincrone possono conservare i valori corretti. il modo CoffeeScript di fare questo (senza utilizzare forEach) è

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

questo viene compilato in qualcosa di molto simile al campione del PO:

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

Utilizzare questo se avete bisogno di < supporto IE9 (forEach supportato in IE a partire dalla versione 9)

Problemi correlati