coffeescript - 如何在列表推导式中使用变量?

标签 coffeescript

我有以下 Coffeescript 代码:

result = ([number, process = number * 2, process] for number in [1, 2, 3])

编译成:

var number, process, result;

result = (function() {
  var _i, _len, _ref, _results;
  _ref = [1, 2, 3];
  _results = [];
  for (_i = 0, _len = _ref.length; _i < _len; _i++) {
    number = _ref[_i];
    _results.push([number, process = number * 2, process]);
  }
  return _results;
})();

结果是一个多维数组:

[ [1, 2, 2], [2, 4, 4], [3, 6, 6] ]

假设 process 的计算成本非常高,我想使用该值作为几个不同函数的参数:

result = ([number, process = /* costly calculation */, function1(process), function2(process), function3(process)] for number in [1, 2, 3])

这实际上很好用。但是,我不希望 process 本身的值成为结果数组的元素。它的值现在仍然是数组的第二个元素。当我查看编译后的 Javascript 时,我可以轻松地将 process 的定义移出数组,如下所示:

for (_i = 0, _len = _ref.length; _i < _len; _i++) {
    number = _ref[_i];
    process = number * 2;
    _results.push([number, process]);
}

如何在 Coffeescript 中做到这一点?

尝试一下 online !

最佳答案

执行此操作,这应该可以解决您的问题:

result = ([number = (process = /* costly calculation */) - process + number, function1(process), function2(process), function3(process)] for number in [1, 2, 3])

这里,将对数组中的每个数字执行两次额外的操作(加法和减法)。但是,它不应该增加太多的计算成本。

可以进一步优化,降低计算成本。

更新:

当你不需要变量numberprocess时使用这个:

result = ([function1(process = /* costly calculation */), function2(process), function3(process)] for number in [1, 2, 3])

关于coffeescript - 如何在列表推导式中使用变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15220968/

相关文章:

angularjs - 使用 angularjs 和 pongular 共享客户端和服务器模块

javascript - JavaScript 中 "class"定义的这三种模式有什么区别?

node.js - 你如何在 Jade 和 Express 中使用动态布局

javascript - CoffeeScript + node.js : Unexpected token > (function arrow)

javascript - Angular $routeParams 是空的

ruby-on-rails - 在 Rails 3.1 中使用不显眼的 Javascript(数据远程)的 Coffeescript 和 Haml

javascript - 如何让 TextMate 在编译时看到 CoffeeScript 中的 "require"表达式?

mysql - Node.js DRY 与 MySQL 客户端

javascript - 数组包含其他数组中的所有元素

javascript - Rails View javascript 未加载