JS—数组的reduce( )

71 阅读2分钟

1.用法概述

reduce()对数组的每个元素执行相同的回调函数。每一次执行将先前元素的计算结果作为参数传入,最后将其结果计算汇总为单个返回值。reduce()可用于计算数组所有元素的总和或数组去重。

2.语法

reduce(callbackFun,initialValue?)

reduce((previousValue,currentValue,currentIndex,array) => { } , initialValue?)

reduce(function(previousValue,currentValue,currentIndex,array) { } , initialValue?)

1)参数

  • callbackFun——数组中每个元素执行的箭头函数,该箭头函数有四个参数。

箭头函数 (previousValue,currentValue,currentIndex,array)

1).previousValue——必需。若索引下标为0,上一个被迭代的数组元素;否则为之前的迭代结果

2).currentValue——可选。当前被迭代的数组元素

3).currentIndex——可选。当前被迭代的数组元素索引

4).array——被迭代的数组

  • initialValue——可选,初始值。若不填initialValue,其初始值是arr[0],此时从索引为1的元素开始迭代;若填写InitialValue,则从索引为0的数组元素开始迭代

2)返回值

返回使用回调函数遍历整个数组后的结果。

3.案例用法

一、计算数组所有元素的总和

//无initialValue初始值
const p1 = [1,2,3,4,5,6];
const p2 = p1.reduce((previousValue, currentValue, currentIndex, array) => previousValue + currentValue );
console.log(p2);    //21
//有initialValue初始值
const p1 = [1,2,3,4,5,6];
const p2 = p1.reduce((previousValue, currentValue, currentIndex, array) => previousValue + currentValue, 10);
console.log(p2);    //31

二、计算数组中每个元素出现的次数

//分析:
//0.initialValue {}                                        cur:'Alice' initialValue['Alice'] = 1  => return {'Alice':1}
// 1.initialValue {'Alice':1}                              cur:'Bob'  initialValue['Bob'] ? initialValue['Bob'] = 1  => return {'Alice':1,"Bob":1}
// 2.initialValue {'Alice':1,"Bob":1}                      cur:'Tiff'  initialValue['Tiff'] ? initialValue['Bob'] = 1  => return {'Alice':1,"Bob":1,"Tiff":1}
// 3.initialValue {'Alice':1,"Bob":1,"Tiff":1}             cur:'Bruce'  initialValue['Bruce'] ? initialValue['Bruce'] = 1  => return {'Alice':1,"Bob":1,"Tiff":1,"Bruce":1}
// 4.initialValue {'Alice':1,"Bob":1,"Tiff":1,"Bruce":1}   cur:'Alice'  initialValue['Alice'] ? initialValue['Alice']++  => return {'Alice':2,"Bob":1,"Tiff":1,"Bruce":1}

<!--写法1-->
const arr = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
const account = arr.reduce((accumulator, cur) => {
    if (cur in accumulator) {
        accumulator[cur]++
    } else {
        accumulator[cur] = 1
    }
    return accumulator
}, {})
console.log(account)  //{ Alice: 2, Bob: 1, Tiff: 1, Bruce: 1 }
<!--写法2-->
const account = arr.reduce((accumulator, cur) => {
    accumulator[cur] ? accumulator[cur]++ : accumulator[cur] = 1
    return accumulator
}, {})
console.log(account)  //{ Alice: 2, Bob: 1, Tiff: 1, Bruce: 1 }
<!--写法3-->
const arr = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice']
const func1 = (arr)=>{
    return arr.reduce((accumulator,cur)=>{
        accumulator.set(cur,accumulator.has(cur) ? accumulator.get(cur)+1 : 1)
      return accumulator
  },new Map())
}
console.log(func1(arr))  //{ Alice: 2, Bob: 1, Tiff: 1, Bruce: 1 }

三、数组去重:对数组arr中所有相同的元素进行去重操作

<!--写法1-->
const arr =[1,2,3,6,6,5,1,2,9,0]
const newArr = arr.reduce((pre,cur)=>{
        pre.includes(cur) ? null : pre.push(cur)
        return pre
    },[])
console.log(newArr);      //[1,2,3,6,5,9,0]
<!--写法2-->
const arr =[1,2,3,6,6,5,1,2,9,0]
const newArr = arr.reduce((pre,cur)=>{
        pre.indexOf(cur)===-1 ? pre.push(cur) : null 
        return pre
    },[])
console.log(newArr);     //[1,2,3,6,5,9,0]

小结:

reduce()功能很强大,可以替换实现filter()、map()方法等。

developer.mozilla.org/zh-CN/docs/…