背景: 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
内包表記を使用する
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」を検索します。
最後に、最初のコメントを見て、さらに役立つ情報を探します。
直接翻訳は次のとおりです。
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
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以降でサポートされています)