JavaScript是当今流行语言中对函数式编程支持最好的编程语言。函数式编程的七个函数分别为:-reduce()和reduceRight()toapplyanoperationtoawholearray,reducingittoasingleresult-map()totransformonearrayintoanotherbyapplyingafunctiontoeachofitselements-flat()tomakeasinglearrayoutofanarrayofarrays-flatMap()tomixtogethermappingandflattening-forEach()tosimplifywritingloopsbyabstractingthenecessaryloopingcode以及search与selection的函数:-filter()topicksomeelementsfromarray-find()andfindIndex()tosearchforelementsthatsatisfyacondition-Apairofpredicates,every()andsome(),tocheckanarrayforaBooleantest1.array.reduce()将数组降维为一个值我们在处理数组的时候,总是会陷入死循环中,陷入琐碎的陷阱,扼杀我们的思维和大脑.reduce的基本工作原理如下:求数列之和,首先从熟悉的数列和开始。constmyArray=[22,9,60,12,4,56];constsum=(x,y)=>x+y;constmySum=myArray.reduce(sum,0);//163观察其运行轨迹:#+begin_srcjs:resultsoutputconstmyArray=[22,9,60,12,4,56];constsumAndLog=(x,y)=>{console.log(`${x}+${y}=${x+y}`);returnx+y;};myArray.reduce(sumAndLog,0);#+end_src#+RESULTS::0+22=22:22+9=31:31+60=91:91+12=103:103+4=107:107+56=163计算平均值有了reduce,我们可以使用“description”的方法,以decalratively的方式得到平均值:constaverage=arr=>arr.reduce(sum,0)/arr.length;console.log(average(myArray));//27.166667计算平均值的第二种方法,将length写入其中:constaverage2=(sum,val,ind,arr)=>{sum+=val;returnind===arr.length-1?sum/arr.length:sum;//以此作为思考的原材料};console.log(myArray.reduce(average2,0));//27.166667s更近了一步,使用average作为固有属性:Array.prototype.average=function(){returnthis.reduce((x,y)=>x+y,0)/this.length;};letmyAvg=[22,9,60,12,4,56].average();//27.166667word计算多个值虽然reduce只能返回单个结果,但是返回的结果可以包含多个元素,比如object。constaverage3=arr=>{constsumCount=arr.reduce((accum,value)=>({sum:value+accum.sum,count:accum.count+1}),{sum:0,count:0});returnsumCount.sum/sumCount.count;};console.log(average3([7,11,19,23]));在数组中重写:constaverage4=arr=>{constsumCount=arr.reduce((accum,value)=>[accum[0]+value,xaccum[1]+1],[0,0]);返回sumCount[0]/sumCount[1];};console.log(average4(myArray));//27.166667从右向左折叠的工作原理如下:比如反向字符串的常规解法是:contreverseString=str=>{letarr=str.split("");arr.reverse();returnarr.join("");};console.log(reverseString("MONTEVIDEO"));//OEDIVETNOM和reduceRight的解法,constreverseString2=str=>str.split("").reduceRight((x,y)=>x+y,"");console.log(reverseString2("OEDIVETNOM"));//MONTEVID2.array.map从数学到编程map首先是一个数学概念。从对象中提取数据constmarkers=[{name:"AR",lat:-34.6,lon:-58.4},{name:"BO",lat:-16.5,lon:-68.1},{name:"BR",lat:-15.8,lon:-47.9},{name:"CL",lat:-33.4,lon:-70.7},{name:"CO",lat:4.6,lon:-74.0},{name:"EC",lat:-0.3,lon:-78.6},{name:"PE",lat:-12.0,lon:-77.0},{name:"PY",lat:-25.2,lon:-57.5},{name:"UY",lat:-34.9,lon:-56.2},{name:"VE",lat:10.5,lon:-66.9},];letaverageLat=average(markers.map(x=>x.lat));//-15.76letaverageLon=average(markers.map(x=>x.lon));//-65.53//extendedarray.prototypeletaverageLat2=markers.map(x=>x.lat).average();letaverageLon2=markers.map(x=>x.lon).average();静默处理数据,看一个我们习以为常的应用:["123.45","67.8","90"].map(parseFloat);//[123.45,67.8,90]["123.45","-67.8","90"].map(parseInt);//[123,NaN,NaN]因为parseInt有一个可选参数radix。数组的表示现在我们来创建一个range.constrange=(start,stop)=>newArray(stop-start).fill(0).map((v,i)=>start+i);//必须写Av,还必须写newletfrom2To6=range(2,7);//[2,3,4,5,6]求幂:constrange=(start,stop)=>newArray(stop-start).fill(0).map((v,i)=>start+i);constfactorialByRange=n=>range(1,n+1).reduce((x,y)=>x*y,1);factorialByRange(5);//120factorialByRange(3);尝试字母表:constALPHABET=range("A".charCodeAt(),"Z".charCodeAt()+1).map(x=>String.fromCharCode(x));//["A","B","C",..."X","Y","Z"]使用reduce构造mapreduce是所有其他函数的起点,constmyMap=(arr,fn)=>arr.reduce((x,y)=>x.concat(fn(y)),[]);尝试两种不同的解决方案:constmyArray=[22,9,60,12,4,56];constdup=x=>2*x;console.log(myArray.map(dup));//[44,18,120,24,8,112]console.log(myMap(myArray,dup));//[44,18,120,24,8,112]console.log(myArray);//[22,9,60,12,4,56][小编推荐]Windows10这个功能已经被禁用了!教你如何彻底关闭C++,C++程序员谁先完蛋?2021年值得关注的人工智能趋势RAID磁盘阵列适合你吗?一阅读文本并了解Windows10是绝唱!微软新系统开始更改版本号
