1

是否有正确的方法来引用forCoffeeScript 中循环的输出。似乎使用内部变量_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)
4

2 回答 2

3

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

于 2011-08-29T04:51:34.360 回答
0

我不相信_results直接从 CoffeeScript 中与生成的变量进行交互是可能的。但是,您可以使用转义的 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函数的实现(我意识到这有点旁白),你应该知道它不会很好地扩展到 large N,因为它必须遍历越来越大的数组(除非在特殊情况下运行时的indexOf效率优于 O(N) 效率)。N不过,使用散列可以相对有效地处理大数据;请在此处查看我提议的 Underscore.js _.uniq 实现。

于 2011-08-29T18:15:03.600 回答