游戏电视苹果数码历史美丽
投稿投诉
美丽时装
彩妆资讯
历史明星
乐活安卓
数码常识
驾车健康
苹果问答
网络发型
电视车载
室内电影
游戏科学
音乐整形

js函数式编程不要再使用for循环啦,试试map吧

  楔子
  在JavaScript中,由于Function本质也是对象(这与Haskell中【函数的本质是值】思路一致),所以我们可以把Function作为参数来进行传递!
  例:functionsayHi(){console。log(Hi);}functionsayBye(){console。log(Bye);}functiongreet(type,sayHi,sayBye){type1?sayHi():sayBye()}greet(1,sayHi,sayBye);Hi
  又得讲这个老生常谈的定义:如果一个函数接收函数作为参数或返回函数作为输出,那么这个函数被称作高阶函数;
  本篇要谈的是:高阶函数中的map、filter、reduce是【如何实践】的,我愿称之为:高阶映射!!
  先别觉得这东西陌生,其实咱们天天都见!!
  例:〔1,2,3〕。map(itemitem2)实践
  Talkischeap。Showmethecode。
  以下有4组代码,每组的2个代码片段实现目标一致,但实现方式有异,感受感受,你更喜欢哪个?
  第1组:
  1constarr1〔1,2,3〕;constarr2〔〕;for(leti0;iarr1。length;i){arr2。push(arr1〔i〕2);}console。log(arr2);〔2,4,6〕
  2constarr1〔1,2,3〕;constarr2arr1。map(itemitem2);console。log(arr2);〔2,4,6〕
  第2组:
  1constbirthYear〔1975,1997,2002,1995,1985〕;constages〔〕;for(leti0;ibirthYear。length;i){letage2018birthYear〔i〕;ages。push(age);}console。log(ages);〔43,21,16,23,33〕
  2constbirthYear〔1975,1997,2002,1995,1985〕;constagesbirthYear。map(year2018year);console。log(ages);〔43,21,16,23,33〕
  第3组:
  1constpersons〔{name:Peter,age:16},{name:Mark,age:18},{name:John,age:27},{name:Jane,age:14},{name:Tony,age:24},〕;constfullAge〔〕;for(leti0;ipersons。length;i){if(persons〔i〕。age18){fullAge。push(persons〔i〕);}}console。log(fullAge);
  2constpersons〔{name:Peter,age:16},{name:Mark,age:18},{name:John,age:27},{name:Jane,age:14},{name:Tony,age:24},〕;constfullAgepersons。filter(personperson。age18);console。log(fullAge);
  第4组:
  1constarr〔5,7,1,8,4〕;letsum0;for(leti0;iarr。length;i){sumsumarr〔i〕;}console。log(sum);25
  2constarr〔5,7,1,8,4〕;constsumarr。reduce(function(accumulator,currentValue){returnaccumulatorcurrentValue;});console。log(sum);25
  更喜欢哪个?有答案了吗?
  每组的代码片段2就是mapfilterreduce高阶函数的应用,没有别的说的,就是更加简洁易读!手写
  实际上,mapfilterreduce也是基于for循环封装来的,所以我们也能自己实现一套相同的高阶映射;map1Array。prototype。map1function(fn){letnewArr〔〕;for(leti0;ithis。length;i){newArr。push(fn(this〔i〕))};returnnewArr;}console。log(〔1,2,3〕。map1(itemitem2))〔2,4,6〕filter1Array。prototype。filter1function(fn){letnewArr〔〕;for(leti0;ithis。length;i){fn(this〔i〕)newArr。push(this〔i〕);}returnnewArr;};console。log(〔1,2,3〕。filter1(itemitem2))〔3〕reduce1Array。prototype。reduce1function(reducer,initVal){for(leti0;ithis。length;i){initValreducer(initVal,this〔i〕,i,this);}returninitVal};console。log(〔1,2,3〕。reduce1((a,b)ab,0))6
  如果你不想直接挂在原型链上:mapForEachfunctionmapForEach(arr,fn){constnewArray〔〕;for(leti0;iarr。length;i){newArray。push(fn(arr〔i〕));}returnnewArray;}mapForEach(〔1,2,3〕,itemitem2)〔2,4,6〕filterForEachfunctionfilterForEach(arr,fn){constnewArray〔〕;for(leti0;iarr。length;i){fn(arr〔i〕)newArray。push(arr〔i〕);}returnnewArray;}filterForEach(〔1,2,3〕,itemitem2)〔3〕reduceForEachfunctionreduceForEach(arr,reducer,initVal){constnewArray〔〕;for(leti0;iarr。length;i){initValreducer(initVal,arr〔i〕,i,arr);}returninitVal;}reduceForEach(〔1,2,3〕,(a,b)ab,0)6
  这里本瓜有个小疑惑,在ES6之前,有没有一个库做过这样的封装小结
  本篇虽基础,但很重要!
  对一些惯用写法的审视、改变,会产生一些奇妙的思路稀松平常的map映射能做的比想象中的要多得多!
  for循环遍历只是操作性的手段,不是目的!而封装过后的map映射有了更易读的意义,映射关系(输入、输出)也是函数式编程之核心!
  YY一下:既然map这类函数都是从for循环封装来的,如果你能封装一个基于for循环的另一种特别实用的高阶映射或者其它高阶函数,是不是意味着:有朝一日有可能被纳入JS版本标准API中?
  或许:先意识到我们每天都在使用的高阶函数,刻意的去使用、训练,然后能举一反三,才能做上面的想象吧我是掘金安东尼:一名人气前端技术博主(文章100w阅读量)
  终身写作者(INFP写作人格)
  坚持与热爱(简书打卡1000日)
  我能陪你一起度过漫长技术岁月吗(以梦为马)
  觉得不错,给个点赞和关注吧(这是我最大的动力)b()d

苹果加州购买制造用地或为苹果汽车做准备IT之家10月21日消息据AppleInsider援引自《硅谷商业杂志》消息,苹果公司已经获得了加利福尼亚州米尔皮塔斯(Milpitas)一个仓库的10年租约,这一仓库面积接近……郭明錤Mac2021年弃用英特尔,苹果汽车20232025年IT之家10月18日消息据AppleInsider消息,郭明錤在最新的投资者报告中谈到了苹果的一系列未来计划,包括苹果的A系列芯片、苹果汽车AppleCar、Mac电脑等。……准备好了吗?iPhone11ProMax京东正式首销IT之家9月13日消息iPhone11、iPhone11Pro和iPhone11ProMa都将于今晚20:00正式开启预售,各位准备好了吗:点此前往京东预售主会场。要想生……低于5499元,苹果iPhone11未上市先破发感谢IT之家网友win10小傲娇的线索投递!IT之家9月13日消息苹果在秋季新品发布会上推出了iPhone11、iPhone11Pro、iPhone11ProMax三款手……英超1客胜布莱顿暂升第二北京时间10月24日0点30分,202122赛季英超联赛第9轮的一场焦点战在运通球场打响,卫冕冠军、暂列积分榜第三的曼城客场对阵与自己2分之差位列积分榜第四的布莱顿。上半场京多……苹果官网iPhone11ProMax上新比周末先到的好戏,是IT之家9月13日消息9月11日,苹果发布了iPhone11、iPhone11Pro、iPhone11ProMax三款手机。内置A13仿生芯片,新的iPhone搭载了刘海屏,i……苹果为何不推游戏主机?李楠iPad不就是么IT之家10月5日消息苹果今年正式推出了iPadmini5,因其较给力的硬件配置和适中的屏幕尺寸而获得了苹果最强游戏机称号。近日魅族前高级副总在回答网友问题时也对iPad的产品……苹果9。7英寸iPad(32GB)国外跳水促销约人民币150IT之家12月20日消息来自外媒gsmarena的分享,苹果今年3月推出的9。7英寸型号iPad,现在可以用我们见过的最低价格购买。通常情况下,32GB(WiFi)型号的起价为……苹果上架大量翻新版iPad(第六代)最低售价仅279美元IT之家11月29日消息来自外媒phonearena的消息,在苹果美国官网,苹果上架了大量的翻新版第六代iPad产品,这些产品均经过官方翻新认证,如果你不介意这是一台翻新机的话……这些地方,从现在开始优惠,你要知道日前,浙江省湖州南浔区召开古镇免费游暨长三角亲子乐园主题新闻发布会,宣布南浔古镇景区向全球所有游客永久免票,免费开放景区2。18平方公里的古镇街区。南浔古镇地处长三角核心……苹果官网iPhone11ProMax全面缺货!发货需23周,IT之家9月29日消息苹果在9月20日正式开售iPhone11、iPhone11Pro、iPhone11ProMax系列新手机,内置A13仿生芯片,新的iPhone搭载了刘海屏……苹果iPhone11在印度热卖,媲美当年iPhone6IT之家9月29日消息多位分析师已经表示iPhone11在中国很受欢迎。现在又有分析师称,iPhone11在印度也很受欢迎,印度在过去的几年中已成为苹果越来越重要的市场。……
爆料新款英特尔版iMac最快本周面世,采用新设计的可能性不大IT之家7月26日消息本周末出现了两个关于苹果新款iMac的新爆料,爆料称苹果可能最快在本周就会发布新款iMac,但不会采用新的设计。第一条爆料来自推特用户Soybeys……网友制作苹果新款iMac渲染图,下巴到底需不需要保留?IT之家6月13日消息日前,有爆料称苹果将在WWDC上亮相新款的iMac设备,引起了网友的广泛关注。外媒MacRumors论坛中的一位平面设计师网友就根据自己的理解设计了几张渲……部分10。5寸iPadPro用户称升级iPadOS13。4。IT之家6月1日消息据Appleinsider报道,许多10。5英寸iPadPro用户抱怨设备遇到了不断重启的Bug,这一问题在苹果发布iPadOS13。4。1以及iPadOS……iPad需求量激增,苹果紧急要求LG加大LCD面板供应IT之家5月29日消息据《韩国商业周刊》报道,受疫情影响,平板电脑需求量激增,苹果公司已向LGDisplay要求紧急供应iPad屏幕面板,以满足亚洲市场对iPad产品的供应需求……一加11取得开门红,用户纷纷投票大内存,几年用下来都舒服!从去年12月开始,搭载高通新一代骁龙8Gen2处理器的旗舰机就陆续上市,多款机型均取得了不错的销量和市场口碑,不过在1月9日刚刚开售的一加11成绩更是出彩,开售仅51分钟后就斩……苹果第八代iPad新爆料搭载A12处理器IT之家5月15日消息爆料人士L0vetodream称,苹果第八代iPad将于今年上市,该产品将由第七代iPad搭载的A10芯片,升级至A12芯片。目前在售的iPad产品……Digitimes苹果下半年推出新款iMac和iPadIT之家6月12日消息今晚,外媒MacRumors援引Digitimes的消息称,苹果公司准备在今年下半年推出新的iMac和iPad机型,稍早前的爆料称新款iMac将在WWDC……MacBookPro13内存定制费用翻倍,苹果称是价格修正IT之家6月2日消息上月底苹果将入门级的13英寸MacBookPro的内存升级价格提高了一倍,美国用户从8GB升级到16GB需要支付200美元,之前的升级价格是100美元。其他……13英寸苹果MacBookPro2020款跑分出炉IT之家5月7日消息新款13英寸苹果MacBookPro的Geekbench性能测试结果已经浮出水面,一起了解一下。售价9999元的基础款13英寸MacBookPro依然……苹果AirPower无线充电板正式宣布死亡感谢IT之家网友rebirthczh的线索投递!IT之家3月30日消息苹果已正式放弃其AirPower产品,理由是它无法满足自己制定的标准。AirPower于201……iFixit拆解苹果AirPods2工艺依旧复杂,几乎不可修IT之家3月29日消息苹果AirPods2正式推出,相比于AirPods一代产品,AirPods2内部结构依旧复杂,iFixit认为,新款AirPods依旧非常难修。根据……揭秘苹果AppleCard实体虚拟卡并存,优化使用流程在春季发布会上推出了AppleCard信用卡服务之后,这项业务将在今年夏天正式上线。因为时间关系,发布会上很多细节没说太清楚,这篇文章再补充解释一下它的工作原理和其他细节。……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网