我正在创建自己的回调函数和更高阶函数组.我坚持复制下划线缩减功能或._reduce函数.有人可以帮助我理解它是如何在引擎盖下工作的,对我来说已经有几天了,我很难过.这是我到目前为止所拥有的.请理解我没有使用下划线库,我试图复制它,以便我可以进一步理解更高阶函数.谢谢.
var reduce = function(collection,iterator,accumulator) { var iterator = function(startPoint,combiner){ for(var i = 0; i <combiner.length; i++){ startPoint += combiner[i]; } return iterator(accumulator,collection); }
解决方法
在这些答案的评论中,Underscore的reduce和Array.prototype.reduce之间存在很多混淆.两个说明:
> Underscore的reduce允许空集合,没有种子值.在这种情况下,它不会抛出错误,而是返回undefined. naomik让我确信这不安全.例如_([]).reduce(function(a,b){return a b});应该抛出错误或返回一个空列表.
> Underscore的reduce适用于对象和数组.
现在,到我原来的帖子:
我实际上做了同样的事情 – 从头开始实施Underscore的关键功能 – 一段时间后,reduce可能是最棘手的.我认为使用非功能性减少更容易降低(为此信用为naomik):
function reduce(arr,func,seed) { var result = seed,len = arr.length,i = 0; for (; i < len; i++) { result = func(result,arr[i]) } return result }
Underscore的实现有点复杂,处理对象和数组,空集合和可选的种子值.它还使用每个而不是for循环,因为它在样式上更具功能性.这是我对Underscore减少的实现:
var reduce = function(coll,seed) { // `isEmpty` (not shown) handles empty arrays,strings,and objects. // Underscore accepts an optional seed value and does not // throw an error if given an empty collection and no seed. if (isEmpty(coll)) { return coll; } var noSeed = arguments.length < 3; // `each` (not shown) should treat arrays and objects // in the same way. each(coll,function(item,i) { if (noSeed) { // This condition passes at most once. If it passes,// this means the user did not provide a seed value. // Default to the first item in the list. noSeed = false; seed = item; } else { seed = func(seed,item,i); } }); return seed; };