reduce lodash.reduce实现原理是什么(reduce,开发技术)

时间:2024-04-29 03:33:05 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

    reduce+lodash.reduce%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86%E6%98%AF%E4%BB%80%E4%B9%88

实现思路:

判断是否有初始值,因为有初始值和没有初始值对回调函数(reducer)执行的次数是有影响的。

遍历数组

组合参数传递给 reducer 进行执行

获取到第三步返回值的时候,要把返回值存储起来,在下一次便利的时候作为reducer第一个参数来替换初始值。

返回最终计算的value值

测试一下:

看起来是不是挺简单的,代码其实还可以更简洁一点:

lodash中 的 reduce 不仅可以对数组生效,也可以对普通 object 、类数组对象生效。

不过也针对数组其实单独实现了一个 arrayReduce 函数,不过没有对外。

来看一下 reducearrayReduce 源码

看得懂吗?不理解的话看下面一份代码,我把非数组类型的代码去掉,再调一下变量命名和新增注释:

可以看出其实大部分逻辑还是和前面的简单实现差不多,不过考虑更全一些,有值得借鉴的地方:

参数判断逻辑更有力,不管外界传递了第三个参数是啥,都说明有初始值

考虑了数组不存在或者为空的情况

下面我们再看一下,去除数组相关的代码来看看针对其他对象类型怎么处理的。

其他类型的都会教给 baseReduce 函数去处理。

使用外部传递进来的遍历方法进行遍历对象,然后传递了一个 callback 给 eachFunc,来执行 iteratee (也就是前面说的reducer),callback 内部的代码就和前面 for 循环或者 while 循环的代码类似的,就是组合参数传递给 reducer 进行执行,不过直接看可能有点不好理解中,了解了原理再来看应该可以理解,注意事项:

initAccum 为 false 时,说明有初始值,直接执行 iteratee。

initAccum 为 true,说明没有初始值,需要添加初始值,因此第一次循环就是赋值给初始值,然后把 initAccum 设置为false,没有进行执行 iteratee,比没有初始值少一次执行,符合逻辑。

eachFunc 用的是 reduce 中传递进来的 baseEach,内部主要就是对对象属性进行遍历的操作,然后把属性值和索引以及对象本身传递给 callback,稍微需要注意的就是可能遇到类数组的对象,为了保证顺序,使用类数组放入索引进行遍历,而其他对象并不能保证属性的传递顺序,可以再看一下baseEach实现的代码:

不是 isArrayLike 的对象遍历与本篇文章的内容没有啥关系了,因此就不深入了。

本文:reduce lodash.reduce实现原理是什么的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:Python函数参数案例分析下一篇:

4 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18