2012-06-14 15 views
24

Antecedentes: Estoy tratando de convertir algo de código JavaScript que utiliza la biblioteca de la Crossfilter con la biblioteca de visualización de datos D3.js en CoffeeScript.¿Cómo se convierte un bucle/función de JavaScript forEach a CoffeeScript

¿Cuál es la mejor forma de convertir JavaScript para cada bucle/función en CoffeeScript?

Aquí está el código 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; 
}); 

Puede CoffeeScript hacer una función en línea dentro de un bucle? En este momento estoy supongo que necesito que rota a cabo en una función y un bucle:

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

coerce(flights) for d in flights 

Respuesta

35

utilizan una comprensión

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

El código anterior se traduce en

var d, i, _i, _len; 

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

por lo que puede ver d y i son lo que quiere que sean.

Go here y busque "forEach" para algunos ejemplos.

Finalmente, mira el primer comentario para obtener más información útil.

+4

Solo para que OP sepa, esto no es equivalente al código JS. Se iterará sobre las propiedades no declaradas, mientras que un 'forEach' no lo hará. Además, no crea un nuevo cierre durante cada iteración, por lo que si hay controladores creados, es posible que no se comporten como se espera. –

+1

great addition, thanx – hvgotcodes

11

La traducción directa es:

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

o se puede utilizar una versión idiomática:

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

Eso parece dar como resultado un bucle 'for'. Un 'forEach' tiene diferencias * sutiles * (o tal vez no tan sutiles) *. –

+0

Estaba hablando WRT la segunda versión. +1 para el primero, que es el equivalente apropiado. No recuerdo si estaba allí cuando comencé. –

3

forEach tiene la ventaja de envolver cada iteración en un cierre. para que las llamadas asincrónicas puedan conservar los valores correctos. la forma CoffeeScript de hacer esto (sin utilizar realmente forEach) es

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

esta compila a algo muy similar a la de la muestra de la 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); 
} 

Usar esta opción si necesita < apoyo IE9 (forEach apoyado en IE, versión 9)

Cuestiones relacionadas