范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

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

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

CBA的江湖外援失去了光彩对外援的大清洗势在必行CBA的裁判尺度一改变,风起则云涌,山鸣则谷应。全联盟的对抗强度空前,惨烈的内线争夺,窒息的盯人防守,走向极简的战术配合,突然迸发的外围远投和急停跳投,让整个赛场充满着血腥而又无比太阳1换1送走球队功勋?布克艾顿或联手榜眼,狼队双塔迎来绝配休赛期,太阳老板被曝存在种族歧视问题,这也直接导致太阳目前正处于易主状态。这对于年龄日益增长的保罗来说,想在退役前冲击总冠军的希望变得更加渺茫了。值得一提的是,在老板深陷丑闻,克劳英媒若无合适报价,曼联愿放C罗自由身离队直播吧10月21日讯据英媒iNews报道,若没有合适的报价,曼联愿让C罗自由身离队。日前,曼联宣布将C罗移出对阵切尔西的比赛大名单,并将其停赛停训后,原因是球员在上轮对阵热刺的比赛胡明轩在场上拼抢很凶,常常让比赛充满悬念,是中国男篮防守尖兵当一个人自身具备某些条件,在某一方面极具天赋时,只要有合适的机会,遇到欣赏自己的伯乐,便可进入发挥自己特长的平台,而这只是开始,在这个领域之中,依然还需要不断地努力,也要持之以恒的八强全部产生,斯诺克北爱尔兰公开赛中国小将迎来夺冠良机北京时间10月21日早上,斯诺克北爱尔兰公开赛八强全部产生,上半区高手云集神仙打架,下半区两位中国斯诺克球员则迎来突破的最佳良机。斯诺克北爱尔兰公开赛八强名单从对阵名单我们可以看出秋日出游趁着秋日暖阳,找个安静的小县城待两天吧,江西宁都是个不错的选择!日子悄悄地溜走,秋风徐徐吹起,转眼已经是秋天,很快就一年过去,2022年只剩下不到80天的时间,年初许下的旅行愿望都实现了吗?千万不要带着遗憾跨年。趁着秋日暖阳温柔,找个安静的小县广州出发韶关新丰岭南红叶世界1天游,赏岭南红枫今天给大家分享一条韶关新丰岭南红叶世界1天旅游行程,赏岭南红枫打卡高山牧场霍比特小屋天空之境。岭南红叶世界,春暖花开夏日避暑秋色赏枫冬日雾凇高山生态茶园星空餐厅打卡高山牧场霍比特屋前景堪忧,跳水世界杯遇大冷,全红婵参赛项目更是遭遇尴尬情况不管是那个竞技体育的世界杯,都是各支参赛队伍非常看重的世界大赛。然而,目前正在德国柏林举行的跳水世界杯,却遭遇到了很大的尴尬。从这次跳水世界杯的参赛队伍来看,不得不说,跳水这个竞技双喜临门!全红婵攻克207C,力压陈芋汐,双人项目仅剩两组选手2022年跳水世界杯,15岁的全红婵迎来世界杯首秀,她在女子单人10米台预赛中以418。50分排名第一,顺利晋级到决赛,击败对手陈芋汐。陈芋汐获得第二名,成绩是404。85分,领先苏北这座城市的地名太混乱,好多本地人都搞不清,游客更是被绕晕这里是刘小顺的旅行和生活研究所。在我国江苏省的中北部,有这么一座非常重要的苏北城市,历史悠久人文底蕴深厚,还有着丰富的旅游资源,一直吸引着大量游客前来旅游,那就是淮安。江苏省淮安市做任何事情必然经历的5个阶段灵魂觉醒,涅槃重生!嘲笑期你做任何的事情最开始都是一个小白。那这个时候你就会遭到所有人的嘲笑。大多数的人,放弃也都是在这个阶段就放弃了。关注期当你经历过嘲笑期之后,你没有放弃,依然
小康股份大涨背后惊现神秘大佬,曾豪言宁德时代涨到3万亿新能源车ETF基金大涨66,汽车是近期资本市场最火热的行业板块。集体狂欢下,许多汽车股甚至逼近历史高点。作为曾经的8倍大妖股,小康股份也没有缺席,股价自今年4月底开始计算,至今已经创造与魔法这个神秘的物种到底有什么用处?在创造与魔法里有很多让人流连忘返的美丽人鱼,很多新的伙伴都还不了解这个物种,它其实是作为一种玩家的陪伴所在。很多人跟风寻找它们,却对这个行为的目的不明所以,其实玩家们是为了这个物种北极圈出现神秘巨洞,难道是外星人所为,为何引起科学家担忧?在俄罗斯的西西伯利亚北部地区,伸向北冰洋的亚马尔半岛和临近的格达半岛上,散布着十几个神秘而又巨大的洞穴,这些洞穴的直径在20米到35米之间,深度超过50米,甚至有一个特别的巨洞的直卡拉格我们总说利物浦怀念马内,但路易斯迪亚斯同样很棒直播吧10月6日讯在本轮结束的一场欧冠小组赛中,利物浦20击败流浪者,路易斯迪亚斯本场首发登场表现不俗,创造一粒点球并由萨拉赫主罚命中锁定胜局。赛后红军名宿卡拉格也对路易斯迪亚斯的神秘的量子纠缠今年诺贝尔物理学奖今年诺贝尔物理学奖颁布给了三位量子学试验者的科学家。一直以来,爱因斯坦并不相信量子力学的理论。总认为试验中隐含了某些不为我们所知的变量导致试验结果。但在三位学家和百多位学生多年的努iOS16。1利好老机型,升级后续航如出厂系统,信号发热大幅度改善iOS16。1beta4发布有几天时间了,这次看上去只是常规的是测试版更新,但从网友的体验来看,这次带来的优化是超出预期的,不少粉丝在问iPhoneXSM能升级吗?今天就给大家分享二维码将退出?以后消费,采用数字人民币硬件钱包?随着互联网的发展,移动支付让人们的生活变得越来越便捷,现在很多中国老百姓出门基本上都不会带现金了,尤其是现在有很多中老年人也都会使用智能手机来支付,只需要手机扫码,很快就能够实现金萧亚轩拄拐杖现身巴黎时装周,浓妆造型脸部僵硬受质疑,网友已经很努力了近日,萧亚轩难得露面现身巴黎时装周,引发网友热议。照片中,萧亚轩穿着一身白色上衣搭配红色长靴,一头银色长发,造型独特,飒气十足,时尚感满满。只见她拄着拐杖,行动不便,在朋友的搀扶下德国要与美国翻脸?德副总理公开批美卖高价天然气,俄释放新信号能源危机之下,德国要与美国翻脸了,德国副总理公开批评美国趁着德国急需天然气的当口卖高价天然气,与此同时,俄罗斯释放出新信号,北溪2有备用管道。据央视新闻报道,当地时间10月5日,外讲讲中药陈皮陈皮,自古以来就是人们喜爱的养生保健药,也广泛应用在人民日常饮食中。陈皮有着一两陈皮一两金的赞誉。陈皮营养价值高,同时具有药用价值。陈皮为芸香科植物橘及其栽培变种的干燥成熟果皮。主灵活就业人员享受社保待遇,有三大调整,你都知道多少呢?作为灵活就业人员,一般情况下在参加社保的过程,仅仅只能够参加其中的城镇职工养老保险和城镇职工医疗保险。但是随着我们国家灵活就业的人口总数,不断的增加。所以灵活就业人员社保将会有更多