天天看點

ES5數組的reduce方法

一、reduce方法接收2個參數

  參數1:function(accumulator, currentValue, index, arr) {},必須

    accumulator:必須,初始值(initialValue)或計算後的傳回值(上次調用函數的傳回值)

    currentValue:必須,目前元素

    index:可選,目前元素的索引

    arr:可選,目前元素所屬的數組

  參數2:initialValue,可選,傳遞給函數的初始值

二、使用場景

  1、數組求和

const arr = [1, 2, 3]
    const total = arr.reduce((acc, cur) => acc + cur)
    const total1 = arr.reduce((acc, cur) => acc + cur, 10)
    console.log(total) // 6
    console.log(total1) // 16      

    一般來說,傳了初始值會更安全

const arr = []
    const total = arr.reduce((acc, cur) => acc + cur, 0) // 不傳初始值會報錯:Reduce of empty array with no initial value
    console.log(total) // 0      

    數組對象中的屬性求和

const arr = [{ x: 1 }, { x: 2 }, { x: 3 }]
    const total = arr.reduce((acc, cur) => acc + cur.x, 0)
    console.log(total) // 6      

    initialValue為0,必傳。這裡可以先通過map拿到所有的x,再求和,但是這樣就多循環了幾次

  2、二維數組轉一維數組

const arr = [[1, 2], [3, 4], [5, 6]]
    const newArr = arr.reduce((acc, cur) => acc.concat(cur), [])
    console.log(newArr) // [1, 2, 3, 4, 5, 6]      

    多元數組轉扁平化

const arr = [
      [1, 2],
      [3, 4],
      [5, [6, 7, [8]]]
    ]
    const flatten = arr => arr.reduce((acc, cur) => acc.concat(Array.isArray(cur) ? flatten(cur) : cur),[])
    const newArr = flatten(arr)
    console.log(newArr) // [1, 2, 3, 4, 5, 6, 7, 8]      

  3、計算數組中每個元素出現的次數

const arr = ['one', 'two', 'three', 'two', 'three', 'three']
    const count = arr.reduce((acc, cur) => {
      if (cur in acc) {
        acc[cur]++
      } else {
        acc[cur] = 1
      }
      return acc
    }, {})
    console.log(count) // {one: 1, two: 2, three: 3}      

  4、去重

const arr = [1, 2, 3, 4, 3, 2, 1]
    const newArr = arr.reduce((acc, cur) => {
      !acc.includes(cur) && acc.push(cur)
      return acc
    }, [])
    console.log(newArr) // [1, 2, 3, 4]      

  5、按屬性對object進行分類

const people = [
      { name: 'Alice', age: 21 },
      { name: 'Max', age: 20 },
      { name: 'Jane', age: 20 }
    ]
    function groupBy(arr, property) {
      return arr.reduce((acc, cur) => {
        const key = cur[property]
        !acc[key] && (acc[key] = [])
        acc[key].push(cur)
        return acc
      }, {})
    }
    const res = groupBy(people, 'age')
    console.log(res) // {20: Array(2), 21: Array(1)}