web-dev-qa-db-fra.com

Comment convertir une boucle / fonction JavaScript forEach en CoffeeScript

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
27
Edward J. Stembler

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.

37
hvgotcodes

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
12
Scott Weinstein

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)

3
user3773172