web-dev-qa-db-ja.com

JavaScript forEachループ/関数をCoffeeScriptに変換する方法

背景Crossfilter ライブラリを D3.jsで使用するJavaScriptコードを変換しようとしています データ視覚化ライブラリを CoffeeScript に変換します。

JavaScript forEachループ/関数をCoffeeScriptに変換する最良の方法は何ですか?

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はループ内でインライン関数を実行できますか?今私はそれを関数とループに分解する必要があると思います:

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

内包表記を使用する

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

diがあなたが望むものであることを確認できます。

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

最後に、最初のコメントを見て、さらに役立つ情報を探します。

37
hvgotcodes

直接翻訳は次のとおりです。

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

forEachには、各反復をクロージャーでラップするという利点があります。したがって、非同期呼び出しは正しい値を保持できます。これを行うためのコーヒースクリプトの方法(実際には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

これは、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はIEバージョン9以降でサポートされています)

3
user3773172