数组中的reduce就像一根魔杖,通过它你可以做一些类似黑科技的事情。语法如下:reduce(callback(accumulator,currentValue[,index,array])[,initialValue])reduce接受两个参数,回调函数和初始值,初始值是可选的。回调函数接受4个参数:累计值、当前值、当前下标、当前数组。如果reduce只有一个参数,那么累加的值就是数组开头的第一个值;如果reduce有两个参数,那么累加的值最初就是initialValue的初始值。然后在每次迭代时,将返回值作为累加器的累加值,用于下一次迭代。今天这些例子中的大部分可能都不是问题的理想解决方案,主要目的是展示如何使用reduce来解决问题。求和乘法//求和[3,5,4,3,6,2,3,4].reduce((a,i)=>a+i);//30//有初始化值[3,5,4,3,6,2,3,4].reduce((a,i)=>a+i,5);//35//如果第一段代码看不懂,那么下面的代码相当于[3,5,4,3,6,2,3,4].reduce(function(a,i){return(a+i)},0);//乘法[3,5,4,3,6,2,3,4].reduce((a,i)=>a*i);查找数组中的最大值如果要使用reduce查找数组中的最大值,可以这样做:[3,5,4,3,6,2,3,4].reduce((a,i)=>Math.max(a,i),-Infinity);上面,在每次迭代中,我们返回累加寄存器和当前项之间的最大值,最后我们得到整个数组的最大值。如果你真的想找到数组中的最大值,而不是上面的,使用更简洁的:Math.max(...[3,5,4,3,6,2,3,4]);统一数组letdata=[["The","re??d","horse"],["Plane","over","the","ocean"],["Chocolate","ice","cream","is","awesome"],["this","is","a","long","sentence"]]letdataConcat=data.map(item=>item.reduce((a,i)=>`${a}${i}`))//Result['Theredhorse','Planeovertheocean','Chocolateicecreamisawesome','thisisalongsentence']这里我们用map遍历数组中的每一项,我们有所有的数组被还原,数组还原为字符串。删除数组中的重复项etdupes=[1,2,3,'a','a','f',3,4,2,'d','d']letwithOutDupes=dupes.reduce((noDupes,curVal)=>{if(noDupes.indexOf(curVal)===-1){noDupes.push(curVal)}returnnoDupes},[])检查累加器数组中是否存在当前值,如果不存在则返回-1,并添加它。当然,您可以使用Set方法快速删除重复值。有兴趣的可以自己Google一下。验证括号[..."(())()(()())"].reduce((a,i)=>i==='('?a+1:a-1,0);//0[..."((())()(()())"].reduce((a,i)=>i==='('?a+1:a-1,0);//1[..."(())(()()))"].reduce((a,i)=>i==='('?a+1:a-1,0);//-1这是一个很酷的项目,之前在里口刷过Groupbyattributeletobj=[{name:'Alice',job:'DataAnalyst',country:'AU'},{name:'Bob',job:'Pilot',country:'US'},{name:'Lewis',job:'Pilot',country:'US'},{name:'Karen',job:'SoftwareEng',country:'CA'},{name:'Jona',job:'Painter',country:'CA'},{name:'Jeremy',job:'Artist',country:'SP'},]letppl=obj.reduce((group,curP)=>{letnewkey=curP['country']if(!group[newkey]){group[newkey]=[]}group[newkey].push(curP)returngroup},[])这里我们按国家对第一个对象数组进行分组,在每次迭代中我们检查键是否存在,如果不存在,我们创建一个数组,然后将当前对象添加到该数组,并返回一个组数组。你可以使用它来创建一个函数,该函数按指定键对对象进行分组。展平数组letflattened=[[3,4,5],[2,5,3],[4,5,6]].reduce((singleArr,nextArray)=>singleArr.concat(nextArray),[])//结果:[3,4,5,2,5,3,4,5,6]这只是一层,如果有多层,可以用递归函数解决,但我不太喜欢在JS上做递归的东西??。一个预先确定的方法是使用.flat方法,它将做与[[3,4,5],[2,5,3],[4,5,6]].flat();相同的事情;只有正数[-3,4,7,2,4].reduce((acc,cur)=>{if(cur>0){letR=cur**2;acc.push(R);}returnacc;},[]);//结果[16,49,4,144]反转字符串constreverseStr=str=>[...str].reduce((a,v)=>v+a)适用此方法适用于任何对象,不仅适用于字符串。调用reverseStr("Hola"),输出结果为aloH。二进制转十进制constbin2dec=str=>[...String(str)].reduce((acc,cur)=>+cur+acc*2,0)//等价于constbin2dec=(str)=>{return[...String(str)].reduce((acc,cur)=>{return+cur+acc*2},0)}为了说明这一点,让我们看一个例子:(10111)->1+(1+(1+(0+(1+0*2)*2)*2)*2)*2。~最后,我是碗慧、励志等,退休后想回家摆地摊。下次见!作者:Ramgen译者:前端小智来源:dev原文:https://dev.to/ramgendepy/learn-javascript-reduce-method-with-5-examples-128n
