Javascript数组 reduce() 方法

语法

  • arr.reduce( callback, initialValue )

简介

  reduce 为数组中的每一个元素依次执行回调函数,接受四个参数:初始值(或者上一次回调函数的返回值)、当前元素值、当前索引、调用 reduce 的数组。

   注意: reduce对于空数组是不会执行回调函数的。

   callback 的参数:

      1.previousValue (上一次回调返回的值,或者是提供的初始值)

      2.currentValue (数组中当前被处理的元素)

      3.index (当前元素在数组中的索引)

      4.array (调用 reduce 的数组)

initialValue 参数

  let arr = [1, 2, 3, 4];
  let sum = arr.reduce(function(prev, cur, index, arr) {
    console.log(prev, cur, index);
    return prev + cur;
  })
  console.log(arr, sum);
  输出的结果为:

  1 2 1
  3 3 2
  6 4 3
  [1,2,3,4] 10
  • 如果 reduce() 方法不提供 initialValue 初始值,则元素索引是从1(数组的第二个元素)开始,初始值为数组的第一个元素
  let arr = [1, 2, 3, 4];
  let sum = arr.reduce(function(prev, cur, index, arr) {
    console.log(prev, cur, index);
    return prev + cur;
  },0)
  console.log(arr, sum);
  输出的结果为:

  0 1 0
  1 2 1
  3 3 2
  6 4 3
  [1,2,3,4] 10
  • 如果 reduce() 方法提供 initialValue 初始值,则元素索引是从0(数组的第一个元素)开始,初始值为提供的值
空数组
  • 对于空数组如果不提供 initialValue 初始值,则会报错 TypeError: Reduce of empty array with no initial value

  • 对于空数组如果提供 initialValue 初始值,则不会报错

用法

  • 求和
  let arr = [1, 2, 3, 4];
  console.log(arr.reduce((x,y)=>x+y));  // 10
  • 求乘积
  let arr = [1, 2, 3, 4];
  console.log(arr.reduce((x,y)=>x*y));  // 24
  • 计算数组中每个元素出现的次数
  let arr = [1,2,3,4,5,6,7,1,2,4];

  写法一:
  let arrcount = arr.reduce((pre,cur)=>{
    if(cur in pre){
      pre[cur]++
    }else{
      pre[cur] = 1;
    }
    return pre
  },{})
  console.log(arrcount);

  写法二:
  let arrcount = arr.reduce((pre,cur)=>(pre[cur]++ || (pre[cur] = 1),pre),{})
  console.log(arrcount);
  • 数组去重
  let arr = [1,2,3,4,5,6,7,1,2,4];
  let newarr = arr.reduce((pre,cur)=>{
    if(!pre.includes(cur)){
      return pre.concat(cur)
    }else{
      return pre
    }
  },[])
  console.log(newarr)
  • 将二维数组转化为一维数组
  let arr = [[0, 1], [2, 3], [4, 5]]
  let newArr = arr.reduce((pre,cur)=>{
    return pre.concat(cur)
  },[])
  console.log(newArr); 
  • 对象属性求和
  let result = [
    {
      subject: 'math',
      score: 10
    },
    {
      subject: 'chinese',
      score: 20
    },
    {
      subject: 'english',
      score: 30
    }
  ];

  let sum = result.reduce(function(prev, cur) {
    return cur.score + prev;
  }, 0);
  console.log(sum)
原文地址:https://www.cnblogs.com/aloneer/p/14500824.html