Underscore.js --- _.contains和_.reduce之间的关系

时间:2015-02-09 03:48:15

标签: javascript underscore.js reduce contain

任何人都可以解释_.reduce函数在_.contain函数中的工作原理吗? 为什么这是"假"对于reduce函数的第三个参数?

_.contains = function(collection, target) { return _.reduce(collection, function(wasFound, item) { if (wasFound) { return true; } return item === target; }, false); };

1 个答案:

答案 0 :(得分:1)

虽然这是_contains的有效版本,但它不是一个非常有效的版本。它不是我在Github repo中看到的,也不是我在annotated source中看到的那个。但它应该工作,以及如何: reduce有三个参数。 (好吧,那里有一个可选的第四个,但我们可以为了这些目的而忽略它。)第一个是要减少的列表,第二个是减少功能,第三个是你要询问的那个。 ,是累加器的初始值。

reduce在第一步之后的每一步都通过reduce函数两个值:上一步的输出和列表中的下一项。该函数的作用是返回下一个值,该值在列表的末尾也是最终输出。但是,在第一步没有传递任何价值。这是第三个参数的用途;它过去常常开始这个过程。因此,对于此contains函数,第一步的虚数先前值为false。在每一步中,该函数都会检查先前的值。如果它是true,则该函数只返回true。如果要测试的列表值与搜索值匹配,则返回true。否则,它返回false

请注意,此规则表示一旦您点击true,它就会保留true

我说这不是很有效的原因是我们可能知道列表包含检查第一项的值。提到的其他实现只是在那时返回true。这个继续处理整个列表。虽然它实际上没有测试任何更多的值,因为它只是继续返回true值,但如果列表很长,当我们知道答案时它仍然相当浪费在前面。