首页 > 其他分享 >对数组方法reduce和map的深入理解,用reduce方法实现map方法

对数组方法reduce和map的深入理解,用reduce方法实现map方法

时间:2024-03-27 17:31:37浏览次数:17  
标签:map arr cur reduce callback 数组 方法

 引言:偶然看到一道面试题,希望可以用reduce方法实现map方法,看过之后发现这是个有趣的逻辑思维题、既要对数组方法有深入理解也要有一定编程能力。

一、reduce语法

reduce:高阶数组方法,对数组中的所有元素应用一个函数(由你提供),将其减少为单个输出值。

arr.reduce((prev,cur,index,arr)={},initialValue)

reduce有两个参数,第一个callback函数,第二个初始值 ,适用于将序列的元素通过某种操作合并成一个单一的结果

callback 函数(执行数组中每个值的函数,包含四个参数):

    prev(必需):上一次调用回调返回的值,或者是提供的初始值(initialValue)
    cur(必需):数组中当前被处理的元素
    index:当前元素在数组中的索引
    arr:调用 reduce 的数组
initialValue(表示初始值,作为第一次调用 callback 的第一个参数):

        如果初始值存在,cur 从数组第一项开始,而prev 是初始值,如果初始值不存在,则 cur 从第二项开始执行,而 prev 是数组第一项的值 

reduce可以实现的功能很多,如数组求和、统计数组中元素出现的次数、数组去重、数组扁平化(flat可以直接用,也可以尝试用reduce写一下)等等。

 二、map语法

map:高阶数组方法,可以对数组中的每个元素进行操作,并返回一个新的数组,新数组的元素个数与原数组相同

array.map((cur, index, arr)=>{}, thisValue)

map也有两个参数,第一个callback函数,第二个指定函数中的 this 值,适用于对列表中的每个元素执行相同操作的情况

callback 函数(操作每个元素的函数,包含三个参数):
    cur:数组中当前被处理的元素
    index:当前元素在数组中的索引
    arr:调用 map的数组

thisValue 指定函数中的 this 值 

三、用reduce实现map

Array.prototype.map2 = function (callback, ctx = null) {
  if (typeof callback !== 'function') {
    throw('callback must be a function')
  }
  return this.reduce((pre, cur, index, arr) => {
    return  pre.concat(callback.call(ctx, cur, index, arr))
  }, [])
}

 总结

虽然在实际开发中很少会用到 reduce 来实现 map,但这种练习仍然有助于提升编程技能和问题解决能力。同时,也可以作为一个有趣的问题,让你更深入地理解 JavaScript 的数组方法。

标签:map,arr,cur,reduce,callback,数组,方法
From: https://blog.csdn.net/m0_59603076/article/details/137078500

相关文章

  • 小白学视觉 | CNN的一些可视化方法
    本文来源公众号“小白学视觉”,仅用于学术分享,侵权删,干货满满。原文链接:一个算法工程师复现算法的踩坑总结作者|yishun@知乎来源丨https://zhuanlan.zhihu.com/p/53683453编辑| 极市平台0导读对神经网络进行可视化分析不管是在学习上还是实际应用上都有很重要的意义,......
  • bit存储读取方法
    一般为了节省内存,一个unsignedchar占8bit,分bit进行存储。存储时单个bit对外可以使用bool值,多个连续的bit可以使用unsignedchar。获取/设置单个bit值方法获取/设置多个连续bit值方法staticboolgetBitValue(unsignedchardata,unsignedcharbit){return(data>>bit......
  • List中的add方法添加对象时出现重复的问题
    现象:用list存储User对象信息,当存储多个对象时,发现存储的数据都是一样的之前代码:Useruser=newUser();List<User>list=newArrayList<>();for(inti=0;i<5;i++){user.setName("Tom"+i);user.setAge("18"+i);user.setLocation("......
  • 6.Stream流收集 Map
    publicclassTest07{publicstaticvoidmain(String[]args){/**创建一个ArrayList集合,并添加以下字符串。字符串中前面是姓名,后面是年龄*"zhangsan,23""lisi,24""wangwu,25""保留年龄大*于等于24岁的人,并将结果收集到Map集合中,......
  • Linux dmesg命令使用方法详解
    Linuxdmesg命令使用方法详解一、命令简介dmesg(displaymessage)命令用于显示开机信息。kernel会将开机信息存储在ringbuffer中。您若是开机时来不及查看信息,可利用dmesg来查看。开机信息亦保存在/var/log/dmesg中。二、使用方法dmesg[options]三、命令选项[root@loc......
  • 3.Android 中Button控件点击事件改变的三个方法总结
    SDKlocationnotfound.DefineavalidSDKlocationwithanANDROID_HOMEenvironmentvariableorbysettingthesdk.dirpathinyourproject'slocalpropertiesfileat'E:\Android\Gao\local.properties'.还没等调试能控制台报错参考https://blog.csdn.n......
  • JavaScript数组常用方法
    数组的常用方法有push(),unshift(),pop(),shift(),reverse(),sort(),splice(),concat(),join(),slice(),.....在工作中常用到的有增删改查,前增unshift,后增push(),前删shift(),后删pop(),修改指定元素splice(),查找indexOf(),lastindexof(),和ES6新增的数组方法forEach()、map()、filter()、r......
  • dbvisualizer和dbeaver工具中执行prepare的语句的方法
    dbvisualizer:用?填充原本是具体值的位置,在弹出的对话框中填入实际的参数即可。SELECTgenderFROMmysql.joe.person_info_all2dbv01wherenumber<?;dbeaver中方法一:用任意字符或字符串填充原本是具体值的位置,在弹出的对话框中填入实际的参数即可。select*frommysql.j......
  • go判断实现接口的方法 var _ Interface = (*Type)(nil)
    阅读源码过程中发现很多var_Interface=(*Type)(nil)写法,对于接口实现情况的判断十分优雅,而自己编写代码过程中鲜有涉及。var_InnerObjectWithSelector=(*PodChaos)(nil)var_InnerObject=(*PodChaos)(nil)其作用就是用来检测*Type是否实现了Interface接口,有多种形......
  • Electron Mac 打包报 Error: Exit code: ENOENT. spawn /usr/bin/python ENOENT 解决
    ElectronMac打包报Error:Exitcode:ENOENT.spawn/usr/bin/pythonENOENT解决方法最近在开发的时候,发现打包Electron项目报错,错误的信息为Error:Exitcode:ENOENT.spawn/usr/bin/pythonENOENT报错原因是因为Mac升级到macOSventuraversion13.0.1后系统移除了......