在for循环期间引用累加器是否安全?

时间:2011-08-29 00:47:23

标签: for-loop coffeescript accumulator

是否有正确的方法来引用CoffeeScript中for循环的输出。似乎使用内部变量_results在某些时候起作用,但它在某些情况下确实有效(如下所示)。是否有一种“正确”的方式来引用稳定的累加器?

作品

Array::unique = ->
  value for value in this when not (value in _results)

不起作用(将迭代器重命名为_results2

Array::unique = ->
  _results = null
  value for value in this when not (value in _results)

也不起作用(将迭代器重命名为_results2

Array::unique = ->
  value for value in (value for value in this) when not (value in _results)

2 个答案:

答案 0 :(得分:3)

累加器是一个实现细节。你不打算与它互动。这就是为什么如果您已经在使用该名称,它会重命名该变量。听起来你想要reduce()函数(Firefox内置它,大多数流行的库都支持它)。

答案 1 :(得分:0)

我不相信可以直接从CoffeeScript与生成的变量(如_results)进行交互。但是,您可以使用转义的JavaScript(编译器忽略)来执行此操作:

Array::unique = ->
  value for value in this when not (`value in _results`)

编译到

Array.prototype.unique = function() {
  var value, _i, _len, _results;
  _results = [];
  for (_i = 0, _len = this.length; _i < _len; _i++) {
    value = this[_i];
    if (!value in _results) {
      _results.push(value);
    }
  }
  return _results;
};

但从风格上来说,我认为在纯CoffeeScript中编写列表理解是更好的选择。它只有3行:

Array::unique = ->
  results = []
  results.push value for value in this when value not in results
  results

关于unique函数的实现(我意识到这有点偏僻),你应该意识到它不适合大N,因为它有遍历越来越大的数组(除了在运行时indexOf具有优于O(N)效率的特殊情况下)。但是,使用哈希可以相对有效地处理大N;看看我提议的Underscore.js'_.uniq here的实现。