32

Background: I'm trying to convert some JavaScript code which uses the the Crossfilter library with D3.js data visualization library into CoffeeScript.

What is the best way to convert a JavaScript forEach loop/function into CoffeeScript?

Here's the JavaScript code:

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

Can CoffeeScript do an in-line function inside a loop? Right now I'm guess I need it broken out into a function and loop:

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

coerce(flights) for d in flights
4

3 に答える 3

46

理解力を使う

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

上記のコードは次のように変換されます

var d, i, _i, _len;

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

だからあなたは彼らになりたいと思うものを見ることができdますi

ここに移動して、いくつかの例について「forEach」を検索してください。

最後に、最初のコメントでさらに役立つ情報を確認してください。

于 2012-06-14T15:51:08.963 に答える
14

直訳は次のとおりです。

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

または、慣用的なバージョンを使用できます。

for d,i in flights
  d.index = i
  d.date = parseDate(d.date)
  d.delay = +d.delay
  d.distance = +d.distance
于 2012-06-14T15:53:54.560 に答える
4

forEach には、各反復をクロージャでラップできるという利点があります。そのため、非同期呼び出しは正しい値を保持できます。(実際にforEachを使用せずに)これを行うcoffeescriptの方法は

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

これは、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);
}

< ie9 のサポートが必要な場合は、これを使用します (forEach はバージョン 9 以降の IE でサポートされています)。

于 2014-06-25T00:10:40.557 に答える