• reduce()方法详解


    一、 定义和用法
    reduce() 方法将数组缩减为单个值。
    reduce() 方法为数组的每个值(从左到右)执行提供的函数。
    函数的返回值存储在累加器中(结果/总计)。

    注释:对没有值的数组元素,不执行 reduce() 方法。
    注释:reduce() 方法不会改变原始数组。

    二、语法

    array.reduce(function(total, currentValue, currentIndex, arr), initialValue)

    三、参数值

    参数  描述
    function(total, currentValue, index, arr) 

    必需。为数组中的每个元素运行的函数。
    函数参数:

    参数描述
    total必需。initialValue,或函数先前返回的值。
    currentValue必需。当前元素的值。
    index 可选。当前元素的数组索引。
    arr  可选。当前元素所属的数组对象
    initialValue

    可选。作为初始值传递给函数的值。

    四、示例如下 

    1、对象里的属性求和

    1. data(){
    2. return{
    3. result: [
    4. {
    5. subject: 'math',
    6. score: 10
    7. },
    8. {
    9. subject: 'chinese',
    10. score: 20
    11. },
    12. {
    13. subject: 'english',
    14. score: 30
    15. }
    16. ];
    17. };
    18. },
    19. computed:{
    20. totalResults(){
    21. return this.result.reduce((sum,result) => {
    22. return sum + result.score
    23. }
    24. }
    25. },0)

    2、实例解析 initialValue 参数

    1. var arr = [1, 2, 3, 4];
    2. var sum = arr.reduce(function(prev, cur, index, arr) {
    3.     console.log(prev, cur, index);
    4.     return prev + cur;
    5. })
    6. console.log(arr, sum);
    7. VM6252:3 1 2 1
    8. VM6252:3 3 3 2
    9. VM6252:3 6 4 3
    10. VM6252:6 (4) [1, 2, 3, 4] 10

    这里可以看出,上面的例子index是从1开始的,第一次的prev的值是数组的第一个值。数组长度是4,但是reduce函数循环3次。

    1. var  arr = [1, 2, 3, 4];
    2. var sum = arr.reduce(function(prev, cur, index, arr) {
    3.     console.log(prev, cur, index);
    4.     return prev + cur;
    5. },0);
    6. console.log(arr, sum);
    7. VM282:3 0 1 0
    8. VM282:3 1 2 1
    9. VM282:3 3 3 2
    10. VM282:3 6 4 3
    11. VM282:6 (4) [1, 2, 3, 4] 10

    结论:如果没有提供initialValue,reduce 会从索引1的地方开始执行 callback 方法,跳过第一个索引。如果提供initialValue,从索引0开始。

    3、reduce的简单用法

    1. var  arr = [1, 2, 3, 4];
    2. var sum = arr.reduce((x,y)=>x+y)
    3. var mul = arr.reduce((x,y)=>x*y)
    4. console.log( sum ); //求和,10
    5. console.log( mul ); //求乘积,24

    4、reduce的高级用法

    (1)计算数组中每个元素出现的次数

    1. let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
    2. let nameNum = names.reduce((pre,cur)=>{
    3.   if(cur in pre){
    4.     pre[cur]++
    5.   }else{
    6.     pre[cur] = 1 
    7.   }
    8.   return pre
    9. },{})
    10. console.log(nameNum); //{Alice: 2, Bob: 1, Tiff: 1, Bruce: 1}

    (2)数组去重

    1. let arr = [1,2,3,4,4,1]
    2. let newArr = arr.reduce((pre,cur)=>{
    3.     if(!pre.includes(cur)){
    4.       return pre.concat(cur)
    5.     }else{
    6.       return pre
    7.     }
    8. },[])
    9. console.log(newArr);// [1, 2, 3, 4]

    (3)将二维数组转化为一维

    1. let arr = [[0, 1], [2, 3], [4, 5]]
    2. let newArr = arr.reduce((pre,cur)=>{
    3.     return pre.concat(cur)
    4. },[])
    5. console.log(newArr); // [0, 1, 2, 3, 4, 5]

    (4)将多维数组转化为一维

    1. let arr = [[0, 1], [2, 3], [4,[5,6,7]]]
    2. const newArr = function(arr){
    3.    return arr.reduce((pre,cur)=>pre.concat(Array.isArray(cur)?newArr(cur):cur),[])
    4. }
    5. console.log(newArr(arr)); //[0, 1, 2, 3, 4, 5, 6, 7]

  • 相关阅读:
    WebGL透视投影
    JavaScript逻辑题:输出1000之内的所有完数。所谓完数指的是:如果一个数恰好等于它的所有因子之和,这个数就称为完数。
    IDEA去除代码和XML中的波浪线(黄色警告线)
    【信号处理】非线性信号处理(Python代码实现)
    VNC Viewer方式的远程连接树莓派
    OpenCV 08(图像滤波器 算子)
    浏览器工作原理与实践--浏览上下文组:如何计算Chrome中渲染进程的个数
    C++实验3:图书管理系统3.0——容器文件流
    【数理方程】分离变量法
    大语言模型LLM原理篇
  • 原文地址:https://blog.csdn.net/qq_37916164/article/details/130898540