ES6的新增许多对数组的操作方法,今天总结一下reduce的常用用法与实现一个reduce函数
[].reduce((pre, cur, index, arr)=>{},init)
pre:上一次累积的返回值,第一次为初始默认值,如没有设置init默认值则为数组的第一项
cur:数组循环的每一项,有init默认值则从数组的第一项开始循环,反之从第二项开始循环
index:数组索引,有init默认值则从数组索引从 0 开始,反之从 1 开始
arr: 数组本身
init:默认值,pre累积初始化值
reduce 叠加
const arr = [1, 2, 3, 4]
const count = arr.reduce((a, b) => a + b)
const arr = [1,2,2,3,4,4]
const arrs = arr.reduce((pre,cur)=>{
!pre.includes(cur) && pre.push(cur)
return pre
},[])
const arr = [
{name: '张三', id: 1},
{name: '李四', id: 2},
{name: '王五', id: 3},
{name: '王五', id: 3},
{name: '张三', id: 1}]
let obj = {}
const arrs = arr.reduce((pre, cur) =>{
obj[cur.id] ? "" : obj[cur.id] = 1 && pre.push(cur)
return pre
}, [])
const arr = [1,[2,3]]
const arrs = arr.reduce((a, b) => {
return a.concat(b)
}, [])
const arr = [1,[2,[3,[4,[5,[6,7]]]]],[8,9]]
function flatArr(arr){
return arr.reduce((pre, cur) => {
return pre.concat(Array.isArray(cur) ? flatArr(cur) : cur)
}, [])
}
const arrs = flatArr(arr)
const str = 'abbcccdddd'
const countStr = str.split('').reduce((pre, cur) => {
pre[cur] ? pre[cur]++ : pre[cur] = 1
return pre
},{})
Array.prototype.myReduce = function(callback, init){
// 数组循环索引
let index = 0
let pre = undefined
if(init){
// 在有设置initialValue的情况下把默认值赋值给累积项pre
pre = init
}else{
// 在没有设置initialValue的情况下把数组的第一项赋值给累积项pre,
// 同时循环从索引 1开始
index = 1
pre = this[0]
}
for(let i = index
pre = callback(pre, this[i], i, this)
}
return pre
}