Contexte : J'essaie de convertir du code JavaScript qui utilise la bibliothèque Crossfilter avec D3.js bibliothèque de visualisation de données dans CoffeeScript .
Quelle est la meilleure façon de convertir une boucle/fonction JavaScript forEach en CoffeeScript?
Voici le code 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 peut-il faire une fonction en ligne dans une boucle? En ce moment, je suppose que j'en ai besoin divisé en une fonction et une boucle:
coerce = (d) ->
d.index = 1
d.date = parseDate(d.date)
d.delay = +d.delay
d.distance = +d.distance
coerce(flights) for d in flights
utiliser une compréhension
for d, i in flights
console.log d, i
Le code ci-dessus se traduit par
var d, i, _i, _len;
for (i = _i = 0, _len = flights.length; _i < _len; i = ++_i) {
d = flights[i];
console.log(d, i);
}
afin que vous puissiez voir d
et i
ce que vous voulez qu'ils soient.
Allez ici et recherchez "forEach" pour quelques exemples.
Enfin, regardez le premier commentaire pour des informations plus utiles.
La traduction directe est:
flights.forEach (d, i) ->
d.index = i
d.date = parseDate(d.date)
d.delay = +d.delay
d.distance = +d.distance
ou vous pouvez utiliser une version idiomatique:
for d,i in flights
d.index = i
d.date = parseDate(d.date)
d.delay = +d.delay
d.distance = +d.distance
forEach a l'avantage d'envelopper chaque itération dans une fermeture. les appels asynchrones peuvent donc conserver les valeurs correctes. la manière la plus simple de faire cela (sans réellement utiliser forEach) est
for d,i in flights
do (d, i)->
d.index = i
d.date = parseDate(d.date)
d.delay = +d.delay
d.distance = +d.distance
cela compile quelque chose de très similaire à l'exemple de l'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);
}
Utilisez-le si vous avez besoin du support <ie9 (forEach supporté dans IE à partir de la version 9)