美文网首页
JavaScript中reduce的模拟实现

JavaScript中reduce的模拟实现

作者: agamgn | 来源:发表于2020-02-09 07:17 被阅读0次

一、前言

 Array.prototype.reduce 是 JavaScript 中比较实用的一个函数,使用方法见JavaScript中Array的map,filter,reduce方法总结

二、基本用法

reduce接收两个参数

callback 迭代数组时,求累计值的回调函数(包含四个参数)
initialValue 作为第一次调用 callback函数时的第一个参数的值,可选

callback 的四个参数:

accumulator 累计器
currentValue 当前值
currentIndex 当前索引
array 数组

callback 接受这四个参数,经过处理后返回新的累计值,而这个累计值会作为新的accumulator 传递给下一个 callback 处理。直到处理完所有的数组项。得到一个最终的累计值。

第二个参数initialValue如果传递了初始值,那么它会作为 accumulator传递给第一个 callback,此时 callback 的第二个参数 currentValue是数组的第一项;如果我们没有传递初始值给 reduce,那么数组的第一项会作为累计值传递给 callback,数组的第二项会作为当前项传递给 callback。

例子:

let arr=[1,2,3,4];
console.log(arr.reduce((acc,val)=>acc+val));//10

提供初始参数:

let arr=[1,2,3,4];
console.log(arr.reduce((acc,val)=>acc+val,90));//100

三、reduce的妙用

 使用reduce还可以完成很多复杂的任务

3.1、数组去重
let arr = [1, 1, 2, 5, 3, 4, 5, 2, 5, 5, 6, 1, 3];
let res = arr.reduce((acc, val) => {
    if (acc.indexOf(val) < 0) {
        acc.push(val);
    }
    return acc;
},[]);
console.log(res);//[ 1, 2, 5, 3, 4, 6 ]
3.2、统计数组中每一项出现的次数
let arr=["agamgn","agam","agamgn","a","agamgn","agam","agamgn","agn"];
let res=arr.reduce((acc,val)=>{
    if(acc[val]===undefined){
        acc[val]=1;
    }else{
        acc[val]++;
    }
    return acc;
},{})
console.log(res);//{ agamgn: 4, agam: 2, a: 1, agn: 1 }

reduce的实用方法还有很多,可以自己摸索。

实现

了解了reduce的用法之后,我们就开始自己模拟实现(没有实现参数校验功能)

Array.prototype.myreduce = function (cb, prev) {
    for (let i = 0; i < this.length; i++) {
        if (!prev) {
            prev = cb(this[i], this[i + 1])
            i++;
        } else {
            prev = cb(prev, this[i])
        }
    }
    return prev
} 
//验证1
let arr = [1, 2, 3];
let res = arr.myreduce((acc,val)=>acc+val,1);
console.log(res);//6
//验证2
const str = 'jshdjsihh';
    const obj = str.split('').myreduce((pre,item) => {
        pre[item] ? pre[item] ++ : pre[item] = 1;
        return pre;
    },{})
console.log(obj) // {j: 2, s: 2, h: 3, d: 1, i: 1}

这里只做了简单的验证,环欢迎查错,讨论、

四、总结

本节代码

相关文章

网友评论

      本文标题:JavaScript中reduce的模拟实现

      本文链接:https://www.haomeiwen.com/subject/woibxhtx.html