数组的reduce方法

时间:2020-7-1 作者:admin

本篇文章介绍了数组reduce的用法,三种常见的使用以及自行实现的reduce介绍。

1.reduce的用法

菜鸟教程:

reduce() 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
reduce() 可以作为一个高阶函数,用于函数的 compose。
注意: reduce() 对于空数组是不会执行回调函数的。
语法:
array.reduce(function(total, currentValue, currentIndex, arr), initialValue)

2.reduce的使用示例

仅仅是文字描述可能很难理解reduce的使用,下面介绍常见的几种使用场景。

①数组求和

const arr=[1,2,3,4,5,6]
    const sum=arr.reduce(
    (prev,item)=>prev+item,//第一个参数,是用于计算的回调函数
    0//第二个参数 是prev的初始值
    )

在上面的代码中,item分别是每一项数组元素,在第一次执行时,prev=0;第二次执行时,prev的值是上一次执行的返回值,即prev+item,直到数组遍历执行完毕,返回最终结果,相当于
0+arr[1]+arr[2]...
进行计算的回调函数中,我们可以写入自己需要的逻辑判断,比如,求数组中大于4的元素之和,加上一条判断语句即可:

const sum=arr.reduce(
(prev,item)=>item>4?prev+item:prev,
0
)

② 数组去重
reduce可以用于数组去重:

const arr = [1, 2, 3, 4, 5, 1, 1, 5, {}, {}, null, null, NaN, NaN]
        const arr2 = arr.reduce((init, item) => {
            init.includes(item) ? null : init.push(item)
            return init;
        }, [])
        console.log(arr, arr2);

以一个空数组init作为初始值,遍历时判断空数组init是否包含正在遍历的该项元素,如果存在,就不做操作,如果不存在,就将元素插入init数组,最后返回该init数组。
includes的方式无法对空对象进行去重。
③框架中使用
比如vue中想要解析页面中的{{person.friend.name}}

//模拟data
        const data = {
            person: {
                friend: {
                    name: 'forceddd'
                }
            }
        }
        //模拟字符串
        const str = 'person.friend.name'
        const res = str.split('.').reduce(
            (data, key) => data[key],
            data
        )
        console.log(res);//'forceddd'

vue先获取到字符串person.friend.name,通过split转换成数组,再利用reduce方法就很方便的取到了data中的值,相当于data[person][friend][name]

3.reduce的实现

Array.prototype.myReduce = function (cb, init = 0) {
            if (typeof cb !== 'function') {
                throw new Error('第一个参数应当是函数')
            }
            if (!this.length) {
                throw new Error('数组不能为空数组')
            }
            for (let i = 0; i < this.length; i++) {
                //遍历数组,将回调函数的返回值作为下一次执行的init使用
                init = cb(init, this[i], i, this);
            }
            //遍历完成之后返回最终的init
            return init;
        }
以上仅为个人理解,如有错谬,欢迎指正
如果对您有所帮助,请您点个赞吧!
声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:87074139@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。