数组reduce

213 阅读1分钟
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)
  • reduce数组去重
    const arr = [1,2,2,3,4,4]
    const arrs = arr.reduce((pre,cur)=>{
        !pre.includes(cur) && pre.push(cur)
        return pre
    },[])
  • reduce 数组对象去重
    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
    },{})
  • js实现reduce函数
    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; i < this.length; i++){
            pre = callback(pre, this[i], i, this)
        }        
        return pre
    }