如何将 JavaScript forEach 循环/函数转换为 CoffeeScript

Posted

技术标签:

【中文标题】如何将 JavaScript forEach 循环/函数转换为 CoffeeScript【英文标题】:How do I convert a JavaScript forEach loop/function to CoffeeScript 【发布时间】:2012-06-17 16:48:05 【问题描述】:

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

【问题讨论】:

【参考方案1】:

使用一个理解

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 是您希望它们成为的样子。

Go here 并搜索“forEach”以获取一些示例。

最后,查看第一条评论以获得更多有用的信息。

【讨论】:

只是让 OP 知道,这不等同于 JS 代码。它会遍历未声明的属性,而 forEach 不会。此外,它不会在每次迭代期间创建新的闭包,因此如果创建了处理程序,它们可能不会按预期运行。【参考方案2】:

直接翻译为:

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

【讨论】:

这似乎导致了for 循环。 forEach 有细微的(或者可能不那么细微) 差异。 我说的是第二个版本。第一个+1,这是适当的等价物。我不记得我评论时它是否在那里。【参考方案3】:

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

如果您需要

【讨论】:

以上是关于如何将 JavaScript forEach 循环/函数转换为 CoffeeScript的主要内容,如果未能解决你的问题,请参考以下文章

(JavaScript) 将 forEach 循环与内部回调同步

JavaScript中如何中断forEach循环

如何在 ForEach 循环之后保留对象变量更改。 Javascript

前端面试 JavaScript— forEach中return有效果吗?如何中断forEach循环?

前端面试 JavaScript— forEach中return有效果吗?如何中断forEach循环?

如何在 Nightwatch 测试的自定义命令中添加嵌套函数 javascript - forEach - 循环遍历元素