用法: 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。 语法:arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue]) 参数: callback:执行数组中每个值 (如果没有提供 initialValue则第一个值除外)的函数,包含四个参数 accumulator:累计器累计回调的返回值; 它是上一次调用回调时返回的累积值,或initialValue(见于下方)。 currentValue:数组中正在处理的元素。 index 可选:数组中正在处理的当前元素的索引。 如果提供了initialValue,则起始索引号为0,否则从索引1起始。 array可选:调用reduce()的数组 initialValue可选:作为第一次调用 callback函数时的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素。 在没有初始值的空数组上调用 reduce 将报错。 返回值:函数累计处理的结果 reducer 函数接收4个参数:

  1. Accumulator (acc) (累计器)
  2. Current Value (cur) (当前值)
  3. Current Index (idx) (当前索引)
  4. Source Array (src) (源数组)
  1. const myTest = [1, 2, 3, 4];
  2. console.log('-----reduce------')
  3. let result = myTest.reduce((arr,cur,idx,src)=>{
  4. console.log(arr,cur,idx,src);
  5. return arr+cur;
  6. },0)
  7. console.log('带initialValue为0的参数:'+result)
  8. let result2 = myTest.reduce((arr,cur,idx,src)=>{
  9. console.log(arr,cur,idx,src);
  10. return arr+cur;
  11. })
  12. console.log('不带initialValue参数:'+result)
  13. Array.prototype.myReduce = function(fun,initialValue){
  14. if(typeof fun !=='function'){
  15. throw new Error(fun + '不是一个函数')
  16. }
  17. if (!Object.Array(this)) {
  18. throw new Error(`this 不是数组`)
  19. }
  20. // initialValue 有初始值时 accumulator为initialValue从0开始循环赋值;
  21. // initialValue 无初始值时 arr[0]为initialValue 从1开始循环
  22. let inVal = initialValue||this[0];
  23. let i = initialValue?0:1;
  24. for (i = 0; i < this.length; i++) {
  25. inVal = fun(accumulator,this[i],i,this)
  26. }
  27. return inVal;
  28. }
  29. console.log('-----myReduce------')
  30. let myResult = myTest.reduce((arr,cur,idx,src)=>{
  31. console.log(arr,cur,idx,src);
  32. return arr+cur;
  33. },10)
  34. console.log('带initialValue为10的参数:'+myResult)
  35. let myResult2 = myTest.reduce((arr,cur,idx,src)=>{
  36. console.log(arr,cur,idx,src);
  37. return arr+cur;
  38. })
  39. console.log('不带initialValue参数:'+myResult2)

image.png

应用场景

Reduce

1.数组里所有值的和

2.将二维数组转化为一维

3.计算数组中每个元素出现的次数

4.按属性对object分类

5.数组去重

6.按顺序运行promise