# baseReduce
# Description
reduce 和 reduceRight 的基本实现,使用 eachFunc 遍历 collection 。
# Params
(collection, iteratee, accumulator, initAccum, eachFunc)
{Array|Object} collection - 要迭代的集合或数组
{Function} iteratee - 每次迭代调用的函数
accumulator - 默认值
{Boolean} initAccum - 是否设置数组第一项为默认值
{Function} eachFunc - 遍历 collection 的函数
# Return
{*}
- 返回累积值
# Code
function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
eachFunc(collection, (value, index, collection) => {
accumulator = initAccum
? (initAccum = false, value)
: iteratee(accumulator, value, index, collection)
})
return accumulator
}
# Analyze
- 调用
eachFunc
进行迭代遍历, 方法写法和baseEach
差不多 - 判断
initAccum
是否取第一项作为默认值,如果取第一项作为默认值,在第一次迭代时,将value
值赋值给accumulator
, 并且将initAccum
置为false
,这里使用了 逗号操作符 - 否则调用
iteratee
方法对每一项进行迭代
# Remark
- 逗号操作符 MDN (opens new window) 对它的每个操作数求值(从左到右),并返回最后一个操作数的值
- 在 baseReduce 中,三目运算符 使用了一个 逗号操作符来将 initAccum 置为 false,主要是因为 逗号操作符 运算符等级太低了 为 0,所以需要用 括号括起来
# Example
const a= [1,2,3,4]
const test = (arr, fun) => {
arr.forEach(fun)
}
const c = baseReduce(a, (total, val) =>total+val, 0, false, test)
console.log(c) // 10