Edw*_*ler 27 javascript foreach coffeescript d3.js crossfilter
背景:我正在尝试将使用带有D3.js数据可视化库的Crossfilter库的一些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;
});
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
hvg*_*des 39
使用理解
for d, i in flights
console.log d, i
Run Code Online (Sandbox Code Playgroud)
上面的代码转换为
var d, i, _i, _len;
for (i = _i = 0, _len = flights.length; _i < _len; i = ++_i) {
d = flights[i];
console.log(d, i);
}
Run Code Online (Sandbox Code Playgroud)
所以你可以看到d和i你想他们是什么.
一些例子,请到这里搜索"forEach".
最后,请查看第一条评论,了解更多有用的信息.
Sco*_*ein 13
直接翻译是:
flights.forEach (d, i) ->
d.index = i
d.date = parseDate(d.date)
d.delay = +d.delay
d.distance = +d.distance
Run Code Online (Sandbox Code Playgroud)
或者您可以使用惯用版本:
for d,i in flights
d.index = i
d.date = parseDate(d.date)
d.delay = +d.delay
d.distance = +d.distance
Run Code Online (Sandbox Code Playgroud)
小智 5
forEach 的优点是将每次迭代包装在闭包中。因此异步调用可以保留正确的值。这样做的coffeescript方法(没有实际使用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
Run Code Online (Sandbox Code Playgroud)
编译后的结果与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);
}
Run Code Online (Sandbox Code Playgroud)
如果您需要 < ie9 支持,请使用此选项(IE 从版本 9 开始支持 forEach)