Underscore.js---_.contains和_.reduce的关系
Underscore.js--- the relationship between _.contains and _.reduce
谁能解释一下 _.reduce 函数在 _.contain 函数中的工作原理?
为什么reduce函数的第三个参数是"false"?
_.contains = function(collection, target) {
return _.reduce(collection, function(wasFound, item) {
if (wasFound) {
return true;
}
return item === target;
}, false);
};
虽然这是 _contains
的工作版本,但效率不是很高。这不是我在 Github repo or the different one I see in the annotated source 中看到的那个。但它应该有效,方法如下:
reduce
接受三个参数。 (好吧,有一个可选的第四个,但出于这些目的我们可以忽略它。)第一个是要减少的列表,第二个是减少函数,第三个,你问的那个,是的初始值一个累加器。
reduce
在第一个传递归约函数后的每一步两个值:上一步的输出和列表中的下一项。该函数的工作是 return 下一个值,列表末尾的值也是最终输出。但是第一步没有传过去的值。这就是第三个参数的作用;它用于启动该过程。所以对于这个 contains
函数,第一步的假想前值是 false
。在每一步中,该函数都会检查先前的值。如果是true
,函数就是returns true
。如果正在测试的列表值与搜索值匹配,则它 returns true
。否则,它 returns false
.
请注意,此规则意味着一旦您点击 true
,它将保持 true
。
我说这效率不高的原因是我们很可能知道列表包含检查第一项的值。其他实现在这一点上简单地提到了 return true
。这个继续处理整个列表。当然它实际上并没有测试更多的值,因为它只是继续 return true
值,但是如果列表很长,当我们预先知道答案时它仍然相当浪费.
谁能解释一下 _.reduce 函数在 _.contain 函数中的工作原理? 为什么reduce函数的第三个参数是"false"?
_.contains = function(collection, target) {
return _.reduce(collection, function(wasFound, item) {
if (wasFound) {
return true;
}
return item === target;
}, false);
};
虽然这是 _contains
的工作版本,但效率不是很高。这不是我在 Github repo or the different one I see in the annotated source 中看到的那个。但它应该有效,方法如下:
reduce
接受三个参数。 (好吧,有一个可选的第四个,但出于这些目的我们可以忽略它。)第一个是要减少的列表,第二个是减少函数,第三个,你问的那个,是的初始值一个累加器。
reduce
在第一个传递归约函数后的每一步两个值:上一步的输出和列表中的下一项。该函数的工作是 return 下一个值,列表末尾的值也是最终输出。但是第一步没有传过去的值。这就是第三个参数的作用;它用于启动该过程。所以对于这个 contains
函数,第一步的假想前值是 false
。在每一步中,该函数都会检查先前的值。如果是true
,函数就是returns true
。如果正在测试的列表值与搜索值匹配,则它 returns true
。否则,它 returns false
.
请注意,此规则意味着一旦您点击 true
,它将保持 true
。
我说这效率不高的原因是我们很可能知道列表包含检查第一项的值。其他实现在这一点上简单地提到了 return true
。这个继续处理整个列表。当然它实际上并没有测试更多的值,因为它只是继续 return true
值,但是如果列表很长,当我们预先知道答案时它仍然相当浪费.