【发布时间】:2016-04-25 17:58:15
【问题描述】:
实现 _.every 方法
我正在尝试掌握以下代码如何实现每个。
_.every = function(collection, iterator) {
var check = iterator || _.identity;
if (collection.length === 0) {
return true;
}
// check if any are falsy
return _.reduce(collection, function (prev, next) {
if (!prev) {
return false;
} else {
return check(next) ? true : false;
}
}, true);
};
我熟悉 reduce 以及它如何接受 accumulator 作为最后一个 argument,但我还没有看到 bool 作为该参数传递。
reduce 中的if 语句也有点令人困惑,因为reduce 将传递累加器,在本例中为true,作为reduce 的iterator 中的第一个参数。所以:
if(!prev) 真正的意思是if(!true),如果不为真则返回假。
这会结束reduce函数吗?还是会转到 else 语句?
任何帮助澄清此代码中发生的事情,或如何实现_.every 的更好示例将不胜感激。
【问题讨论】:
-
如果不是真的 - 然后转到其他部分
-
你似乎对reduce不太熟悉。我建议阅读underscore documentation 和MDN
-
似乎不是一个好方法,因为它仍然迭代每个数组元素,即使它知道答案是错误的。最好在知道答案后立即停止迭代。最坏的情况:
_.every(Array(999999), fn)会循环一百万次... -
这段代码是从哪里来的?
reduce的主体可以是return prev && check(next);。此外,为了兼容性,应使用(elt, idx, arr)调用check。collection.length检查可能是微优化但不是必需的。 -
@torazaburo:您必须查看下划线源的其余部分,它比其他任何东西都更具可读性,即使这意味着不是最简洁的。它也不应该与原生 Array 方法兼容....(没有跳过稀疏部分,没有
this方法回调上的应用程序等)
标签: javascript function functional-programming underscore.js implementation