任何人都可以解释_.reduce函数在_.contain函数中的工作原理吗? 为什么这是"假"对于reduce函数的第三个参数?
_.contains = function(collection, target) {
return _.reduce(collection, function(wasFound, item) {
if (wasFound) {
return true;
}
return item === target;
}, false);
};
答案 0 :(得分:1)
虽然这是_contains
的有效版本,但它不是一个非常有效的版本。它不是我在Github repo中看到的,也不是我在annotated source中看到的那个。但它应该工作,以及如何:
reduce
有三个参数。 (好吧,那里有一个可选的第四个,但我们可以为了这些目的而忽略它。)第一个是要减少的列表,第二个是减少功能,第三个是你要询问的那个。 ,是累加器的初始值。
reduce
在第一步之后的每一步都通过reduce函数两个值:上一步的输出和列表中的下一项。该函数的作用是返回下一个值,该值在列表的末尾也是最终输出。但是,在第一步没有传递任何价值。这是第三个参数的用途;它过去常常开始这个过程。因此,对于此contains
函数,第一步的虚数先前值为false
。在每一步中,该函数都会检查先前的值。如果它是true
,则该函数只返回true
。如果要测试的列表值与搜索值匹配,则返回true
。否则,它返回false
。
请注意,此规则表示一旦您点击true
,它就会保留true
。
我说这不是很有效的原因是我们可能知道列表包含检查第一项的值。提到的其他实现只是在那时返回true
。这个继续处理整个列表。虽然它实际上没有测试任何更多的值,因为它只是继续返回true
值,但如果列表很长,当我们知道答案时它仍然相当浪费在前面。