当前位置: 首页 > 科技观察

从ArrayReduce构建Map等12个函数

时间:2023-03-15 19:17:17 科技观察

众所周知,JavaScript是当今流行语言中对函数式编程支持最好的编程语言。函数式编程“从一到无穷大”的出发点是reduce。在本文中,我们将尝试从reduce开始构建所有其他函数。1.万物之始。array.reduce的应用Reduce的核心是降维,将数组降维为一个值,比如求和:constarr=[52,71,27,38];constsum=(x,y)=>x+y;constcusSum=arr.reduce(sum,0);使用reduce作为思维工具,时刻牢记初值。2.构造array.map从数学到编程map是一种数学思维,直接进入编程。它是从reduce模拟和构建的:constcusMap=(arr,fn)=>arr.reduce((x,y)=>x.concat(fn(y)),[]);3.构造array.flatarray.flatMap,将数组展平。从array.flat中,我们可以看到声明式编程的优势。我们只需要专注于要完成的任务,而不管实现细节。使用reduce实现:当只平到一级深度时:#flatonytoonelevelconstflat1=arr=>[].concat(...arr);constflat2=arr=arr.reduce(acc,v=>acc.concat(v),[])当你需要扁平化到任意深度时,使用reduce完全重构扁平化:if(!Array.prototype.flat){Array.prototype.flat=function(n=1){this.flatAllX=()=>this.reduce((f,v)=>f.concat(Array.isArray(v)?v.flat(Infinity):v),[]);this.flatOneX=()=>this.reduce((f,v)=>f.concat(v),[]);returnn===Infinity?this.flatAllX():n===1?this.flatOneX():this.flatOneX().flat(n-1);};}四、array.filter走向高层逻辑来判断为什么要用reduce重构逻辑谓词,因为它可以帮助记住函数和最终输出累加器的概念。constcusFilter=(arr,fn)=>arr.reduce((acc,val)=>(fn(val)?acc.concat(y):acc),[]);五、array.find和array.findIndex只查找第一个元素array.filter会过滤掉所有符合要求的元素。当我们只需要单个元素时,我们将应用array.find.constcusFind=arr.reduce((acc,val)=>(acc===undefined&&fn(val)?val:acc),undefined);rebuildarray.findIndex:constcusFindIndex=arr.reduce((x,y,i)=>(x==-1&&fn(y)?i:x),-1);此外,我们使用find和findIndex来简单地构建includes和indexOf。arr.includes(value);//arr.find(v=>v===value)arr.indexOf(value);//arr.findIndex(v=>v===value)六、快速数组。有的和array.everyarray有的是简单的函数,但是好想好用。//arr.every(fn);arr.reduce((a,v)=>a&&fn(v),true);//aforaccumulator,//arr.some(fn);arr.reduce((a,v)=>a||fn(v),false);//vforvalue至此,我们从reduce开始,模拟所有其他的高阶函数。Reducesimulation帮助我们加强了每个函数的输入参数和输出结果的识别。