在前端开发过程、或者面试过程中,别人问你数组常用的操作,你也许立刻马上回答for循环、forEachfor..of
mapsomereduce等方法。我相信前端开发的小伙伴,10个人中有8个对reduce仅仅是停留在数据累加上,
下面本人介绍一些reduce函数的妙用之处。

一、回顾下reduce函数的参数问题

  • 1、reduce函数

    Array.prototype.reduce(function(previousVal, currentVal, index, _this) {// 函数体
    }, initVal);
    
  • 2、理解上面的函数

    • 1.reduce函数也是对数组迭代的过程
    • 2.第一次循环的时候,previousVal==initVal
    • 3.从第二次开始,previousVal==reducer函数中的返回值了
    • 4、index表示当前数组的序列化
    • 5、_this表示当前的数组

二、自己手动实现一个reduce函数

  • 1、自己扩展数组的方法

    Array.prototype.myReduce = function(fn, initVal) {if (Object.prototype.toString.call(this) != '[object Array]') {throw new Error('当前是数组的方法,不能使用到别的上面');}let total;if (initVal != undefined) {total = initVal;} else {total = this[0];}if (initVal === undefined) {for (let i = 1; i < this.length; i++) {total = fn(total, this[i], i, this);}} else {for (let [index, val] of this.entries()) {total = fn(total, val, index, this);}}return total;
    };
    

一、数据累加

  • 1、数据原

    let ary1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
    
  • 2、数据叠加

    const result = ary1.reduce((pre, cur) => pre + cur);
    console.log(result);
    

二、将数组转换为对象

  • 1、实现代码

    const userList = [{id: 1,username: 'john',sex: 1,email: 'john@163.com'},{id: 2,username: 'jerry',sex: 1,email: 'jerry@163.com'},{id: 3,username: 'nancy',sex: 0,email: ''}
    ];let result = userList.reduce((pre, current) => {return {...pre, [current.id]: current};
    }, {});console.log(result);
    

三、将大数组转换成小数组

  • 1、实现代码

    const fileLines = ['Inspector Algar,Inspector Bardle,Mr. Barker,Inspector Barton','Inspector Baynes,Inspector Bradstreet,Inspector Sam Brown','Monsieur Dubugue,Birdy Edwards,Inspector Forbes,Inspector Forrester','Inspector Gregory,Inspector Tobias Gregson,Inspector Hill','Inspector Stanley Hopkins,Inspector Athelney Jones'
    ];let result = fileLines.reduce((pre, current) => {return pre.concat(current.split(/,/g));
    }, []);console.log(result);
    

四、将数组展开

  • 1、实现代码

    const arr = ["今天天气不错", "", "早上好"];const arr2 = arr.reduce((pre, cur) => {return pre.concat(cur.split(''));
    }, []);
    console.log(arr2);
    

五、求数组的最大值与最小值

  • 1、实现代码

    const readings = [0.3, 1.2, 3.4, 0.2, 3.2, 5.5, 0.4];let minValue = readings.reduce((x,y) => Math.min(x,y));
    console.log(minValue);
    let maxValue = readings.reduce((x,y) => Math.max(x,y));
    console.log(maxValue);
    

六、使用reduce写一个工具方法,用来提取对象中的数据

  • 1、后端返回的一个对象

    let obj1 = {"result": {"report": {"contactInfo": {"callsNumber": 0,"contactsNumber": 0,"emergencyContactHasOverdue": "No","sameLiainson": {"isSame": "Yes","accounts": "aa"}}}}
    };
    
  • 2、使用reduce的工具方法

    const objectGetVal = (obj, expr) => {if (!Object.is(Object.prototype.toString.call(obj), '[object Object]')) {throw new Error(`${obj}不是对象`);}if (!Object.is(Object.prototype.toString.call(expr), '[object String]')) {throw new Error(`${expr}必须是字符串`);}return expr.split('.').reduce((prev, next) => {if (prev) {return prev[next]} else {return undefined;}}, obj)
    };
    console.log(objectGetVal(obj1, 'result.report.contactInfo.emergencyContactHasOverdue'));
    console.log(objectGetVal(obj1, 'result.report.emergencyContactHasOverdue'));
    // 输出结果
    // No
    // undefined
    

七、使用reduce生成树型菜单参考

数组的reduce的妙用之处相关推荐

  1. JavaScript 中数组方法 reduce 的妙用之处

    Javascript数组方法中,相比map.filter.forEach等常用的迭代方法,reduce常常被我们所忽略,今天一起来探究一下reduce在我们实战开发当中,能有哪些妙用之处,下面从red ...

  2. 【JavaScript】查漏补缺 —数组中reduce()方法

    [JavaScript]查漏补缺 -数组中reduce()方法

  3. js中ES6新增的数组方法reduce(),和数组去重,降维。

    js中ES6新增的数组方法reduce() js数组reduce()详解 基本概念: reduce()方法接收一个函数作为累加器,数组中的每一值(从左到右)开始缩减,最后成为一个值 reduce()为 ...

  4. 数组的 reduce方法

    数组的 reduce方法 reduce() 方法对数组中的每个元素按序执行一个由你提供的 reducer 函数,每次运行都会 将先前元素的计算结果作为参数传入,最后将其结果 汇总为单个返回值. 当第一 ...

  5. 几个关于js数组方法reduce的经典片段

    以下是个人在工作中收藏总结的一些关于javascript数组方法reduce的相关代码片段,后续遇到其他使用这个函数的场景,将会陆续添加,这里作为备忘. javascript数组那么多方法,为什么我要 ...

  6. 数组求和-reduce方法

    function sum(...numbers){return numbers.reduce((pre,current)=>{return pre + current}) } console.l ...

  7. swift 数组 filter reduce sort 等方法

    数组的常用方法 swift 数组有很多的操作方法,但是用的时候用常常想不起来,就列出来看看 map 和 flatMap 对数组中的元素进行变形操作 filter 主要对数组进行过滤 reduce 主要 ...

  8. 数组的reduce方法

    reduce方法有两个参数,第一个参数是操作数组项的函数:第二个参数则是传入的初始值,reduce最常用的方法是叠加,以下例子可以看出,reduce函数根据初始值0,不断的叠加数组项: var ite ...

  9. delphi7存储过程传入数组_js数组方法reduce

    JS数组Reduce方法详解 reduce方法将会对数组元素从左到右依次执行reducer函数,然后返回一个累计的值. reduce函数的参数 reduce函数接收两个参数,第一个参数是回调函数red ...

最新文章

  1. 【直播】陈信达:零基础计算机视觉之机器学习基础
  2. cisco router修改mac
  3. I—爆炸的符卡洋洋洒洒(不模不行的DP)
  4. 封装JDBC—非框架开发必备的封装类
  5. node.js 与 nvm安装教程
  6. SUFFER软件测试工程师,Ubuntu9.0.4下FreeSurfer的安装(转)
  7. UNIX 环境高级编程之我见
  8. 卡顿、画面撕裂、延迟、晕眩为什么与帧率、刷新率有关
  9. 单路电压表c语言编程,基于ADC0809和AT89S52单片机的数字电压表的设计
  10. nginx 屏蔽某些ip,防止有些人刷接口攻击
  11. No all pattern found! file already patched?
  12. bellman算法流程
  13. 自定义注解实现RBAC权限校验,不要再说你不会了
  14. React.createClass()方法
  15. [UE4]Set Skeletal Mesh,在蓝图中设置骨骼模型
  16. w7上 android模拟器,win7系统运行安卓模拟器的操作方法
  17. OpenCV图像处理总结 ——用opencv给图片换背景色为例
  18. java lang ClassCastException java lang Integer cannot be ca
  19. 关于性能测试(网络)
  20. 滚动的gridview

热门文章

  1. postgresql FDW概念、用法与原理小结
  2. 苹果笔记本硬盘替换方案
  3. Windows Project2016如何增加加班工时。
  4. elasticsearch forcemerge
  5. 无觅科技分析:小红书海外版云手机,养号增粉点赞利器
  6. 再不复工,公司就要发现没有我们也能正常运转了
  7. 通信研究生适合发表的优质期刊(中文)
  8. L1-030——一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。
  9. 上海云盾技术贴趣味性讲解DDoS防御
  10. 如何加入家庭组计算机打印机,解决方案:Win7系统设置家庭组计算机设置共享打印机...