本篇文章介绍了数组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;
}