是否有正确的方法来引用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)
答案 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的实现。