任何人都可以解释 _.reduce 函数如何在 _.contain 函数中工作吗? 为什么reduce函数的第三个参数是“false”?
_.contains = 函数(集合,目标){
返回 _.reduce(集合, 函数(wasFound, 项目) {
如果(被发现){
返回真;
}
返回项目 === 目标;
}, 错误的);
};
最佳答案
尽管这是 _contains
的一个工作版本,但它并不是一个非常高效的版本。这不是我在 Github repo 中看到的那个或者我在 annotated source 中看到的不同的一个。但它应该可以工作,方法如下:
reduce
采用三个参数。 (嗯,有一个可选的第四个,但出于这些目的,我们可以忽略它。)第一个是要减少的列表,第二个是减少函数,第三个是您要问的,是初始值累加器。
reduce
在第一个向减少函数传递两个值之后的每个步骤:上一步的输出和列表中的下一项。该函数的作用是返回下一个值,该值在列表末尾也是最终输出。但第一步没有传入任何先前的值。这就是第三个参数的用途;它用于启动该过程。因此,对于此 contains
函数,第一步的假想先前值为 false
。在每个步骤中,该函数都会检查之前的值。如果为 true
,则该函数仅返回 true
。如果正在测试的列表值与搜索值匹配,则返回true
。否则,它返回false
。
请注意,此规则意味着一旦您达到 true
,它将保持 true
。
我之所以说这效率较低,是因为我们很可能知道列表包含检查第一项时的值。提到的其他实现仅在此时返回 true
。这个继续处理整个列表。当然,它实际上并没有测试更多的值,因为它只是一路上继续返回 true 值,但如果列表很长,当我们预先知道答案时,它仍然相当浪费。
关于javascript - Underscore.js---_.contains和_.reduce的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28402509/