Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

模拟实现 reduce #19

Open
lurenacm opened this issue Jun 20, 2021 · 0 comments
Open

模拟实现 reduce #19

lurenacm opened this issue Jun 20, 2021 · 0 comments

Comments

@lurenacm
Copy link
Owner

  • reduce 收敛 (高频使用)
    • 作用:reduce 方法为数组中的每个元素执行一次 callback 函数,数组中的每一个元素汇总为单个返回值。
    • 参数:reduce(callback(preVal, currentValue, index, array), initialValue)element 表示当前数组的一项,数组中的每一个元素都调用一次 callbackinitialValue 表示回调函数的第一个参数,不传第一个值就是数组的第一个元素,不能为空。
    • 返回值:返回一个执行后的汇总值。
    • 原数组:不变
// 数组求和
let arr1 = [1,2,3]
let r = arr1.reduce((pre, cur) => {
    return pre+cur
}, 0)
r // 6

reduce 参数在数组求和中会将数组的第一项和第二项相加后重新给 pre=3, 此时的 cur3,最后两者相机返回给r

// 对象求和
let objSum = [{a:1, count:2}, {a:2, count:3}, {a: 2, count: 3}].reduce((pre, cur) => {
    return pre.a * pre.count + cur.a * cur.count
})

在上面的求和中第一次运算的结果返回给 pre=500,但是下一次运算时 500.a 是肯定不存在的,所以需要给 reduce 添加第二个默认参数 0,让 pre=0 作为初始值,修改代码如下

let objSum = [{a:1, count:2}, {a:2, count:3}, {a: 2, count: 3}].reduce((pre, cur) => {
    return pre + cur.a * cur.count
}, 0)

编写 myReduce() 方法

思路: 上面提到过,数组的每一项都会使用到callback回调函数,这里可以使用 for 循环实现,同时初始值initVal是给callback的第一个参数 pre 赋值,可传可以不传。

Array.prototype.myReduce = function (callback, initVal) {
    for (let index = 0; index < this.length; index++) {
        if (initVal) {
            callback(pre = initVal, cur = this[index], index, this)
        } else {
            callback(pre = this[index], cur = this[index + 1], index, this)
        }
    }
}

let arr = [1, 2]
let a = arr.reduce((pre, cur, index, arr) => {
    // console.log(pre, cur, index, arr)
    return pre + cur
}, 0)
console.log(a) // 3

测试结果正确。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant