32

背景:我正在尝试将一些使用带有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;
});

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

所以你可以看到di成为你想要的样子。

转到此处并搜索“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)是

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 支持,请使用此功能(IE 开始版本 9 支持 forEach)

于 2014-06-25T00:10:40.557 回答