一、前言
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}
这里只做了简单的验证,环欢迎查错,讨论、
网友评论