js中关于reduce()方法的使用和实例

123 阅读2分钟

语法

arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])

参数

  • callback 执行数组中每个值 (如果没有提供 initialValue则第一个值除外)的函数
  • accumulator 累计器累计回调的返回值; 它是上一次调用回调时返回的累积值,或initialValue
  • currentValue 数组中正在处理的元素
  • index(可选) 数组中正在处理的当前元素的索引。 如果提供了initialValue,则起始索引号为0,否则从索引1起始。
  • array(可选) 调用reduce()的数组
  • initialValue(可选) 作为第一次调用 callback函数时的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素。 在没有初始值的空数组上调用 reduce 将报错。

描述

reduce为数组中的每一个元素依次执行callback函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:

  • accumulator 累计器
  • currentValue 当前值
  • currentIndex 当前索引
  • array 数组 回调函数第一次执行时,accumulator 和currentValue的取值有两种情况:如果调用reduce()时提供了initialValueaccumulator取值为initialValuecurrentValue取数组中的第一个值;如果没有提供 initialValue,那么accumulator取数组中的第一个值,currentValue取数组中的第二个值。

如果数组为空且没有提供initialValue,会抛出[TypeError]。如果数组仅有一个元素(无论位置如何)并且没有提供initialValue, 或者有提供initialValue但是数组为空,那么此唯一值将被返回并且callback不会被执行。

实例

  1. 数组求和
let arr = [20,30,40,50,60,70]
let sum = arr.reduce((prev,cur) => {
  return prev+cur
},0)
//输出 270
  1. 求数组的最大值
let arr = [20,30,40,50,60,70]
let max = arr.reduce((prev,cur) => {
    return Math.max(prev,cur);
}) //输出70
  1. 累加对象数组里的值,要累加对象数组中包含的值,必须提供初始值,以便各个item正确通过你的函数。
let initValue = 0;
let sum = [{x:1},{x:2},{x:3},{x:4},{x:5}].reduce((prev,cur) => {
  return prev+cur.x
},initValue); //输出15
  1. 数组去重
let arr = [1,2,2,3,3,4,5,6,4,5]
let newArr = arr.reduce((prev,cur) => {
  prev.indexOf(cur) === -1 && prev.push(cur)
  return prev
},[]) //输出[1,2,3,4,5,6]

//另一种实现方式
newArr = arr.reduce((prev,cur) => {
    if(!prev.includes(cur)){
        prev.push(cur)
    }
    return prev
},[])
  1. 使用reduce将二维数组转换为一维数组
const arr = [[1,2],[3,4],[5,6],[7,8]];
let newArr = arr.reduce((prev,cur) => {
  return prev.concat(cur);
})  //输出[1, 2, 3, 4, 5, 6, 7, 8]
  1. 计算数组中每个元素出现的次数
/* 如何运行?
      {} 'Alice'
      {Alice: 1} 'Bob'
      {Alice: 1, Bob: 1} 'Tiff'
      {Alice: 1, Bob: 1, Tiff: 1} 'Bruce'
      {Alice: 1, Bob: 1, Tiff: 1, Bruce: 1} 'Alice'
      {Alice: 2, Bob: 1, Tiff: 1, Bruce: 1}
    */
    let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
    let countNames = names.reduce((allNames,name) => {
      console.log(allNames,name)
      if(name in allNames){
        allNames[name]++
      }else{
        allNames[name] = 1;
      }
      return allNames
    },{})
    //输出 {Alice: 2, Bob: 1, Tiff: 1, Bruce: 1}