1、语法array.reduce(function(prev,cur,index,arr),initialValue)//简写方便解释arr.reduce(callback,[initialValue])参数含义:callback(execute数组中每个值的函数,包含四个参数)1.previousValue(上次回调调用返回的值,或者提供的初始值(initialValue))2.currentValue(数组中当前处理的元素)3.index(当前元素在数组中的索引)4.array(调用reduce的数组)initialValue(作为第一次调用回调的第一个参数。)类似于设置初始值2.实例解析initialValue参数先看第一个例子:vararr=[1,2,3,4];varsum=arr.reduce(function(prev,cur,index,arr){console.log(prev,cur,index);returnprev+cur;})console.log(arr,sum);//打印结果://121//332//643//[1,2,3,4]10这里可以看出上面的例子index是从1开始的,第一个prev的值为数组的第一个值。数组的长度是4,但是reduce函数循环了3次。看第二个例子:vararr=[1,2,3,4];varsum=arr.reduce(function(prev,cur,index,arr){console.log(prev,cur,index);returnprev+cur;},0)//注意这里设置了初始值console.log(arr,sum);//打印结果://010//121//332//643//[1,2,3,4]10在这个例子中,索引从0开始,第一个prev的值就是我们设置的初始值0,数组长度为4,reduce函数循环4次。结论:如果没有提供initialValue,reduce将从索引1开始执行回调方法,跳过第一个索引。如果提供了initialValue,它从索引0开始。注意:如果数组为空,那么在应用reduce时会发生什么?变量arr=[];varsum=arr.reduce(function(prev,cur,index,arr){console.log(prev,cur,index);returnprev+cur;})//错误,"TypeError:Reduceofemptyarraywithnoinitialvalue"但是如果我们设置初始值,则不会报错,如下:vararr=[];varsum=arr.reduce(function(prev,cur,index,arr){console.log(prev,cur,index);returnprev+cur;},0)console.log(arr,sum);//[]0所以一般我们提供初始值3比较安全。reduce的简单用法当然是最简单的了,我们用的就是我们常用数组的求和和乘积。vararr=[1,2,3,4];varsum=arr.减少((x,y)=>x+y)varmul=arr。减少((x,y)=>x*y)控制台.log(总和);//求和,10console.log(mul);//乘法,244,reduce的高??级用法(1)计算数组中每个元素出现的次数letnames=['Alice','Bob','Tiff','Bruce','Alice'];letnameNum=names.reduce((pre,cur)=>{if(curinpre){pre[cur]++}else{pre[cur]=1}returnpre},{})console.log(nameNum);//{Alice:2,Bob:1,Tiff:1,Bruce:1}(2)数组去重letarr=[1,2,3,4,4,1]letnewArr=arr.reduce((pre,cur)=>{if(!pre.includes(cur)){returnpre.concat(cur)}else{returnpre}},[])console.log(newArr);//[1,2,3,4](3)将二维数组转化为一维letarr=[[0,1],[2,3],[4,5]]letnewArr=arr.reduce((pre,cur)=>{returnpre.concat(cur)},[])console.log(newArr);//[0,1,2,3,4,5](3)将多维数组转换为一维数组letarr=[[0,1],[2,3],[4,[5,6,7]]]constnewArr=function(arr){returnarr.reduce((pre,cur)=>pre.concat(Array.isArray(cur)?newArr(cur):cur),[])}控制台。日志(newArr(arr));//[0,1,2,3,4,5,6,7](4)对象中属性的总和varresult=[{subject:'math',score:10},{subject:'chinese',分数:20},{主题:'英语',分数:30}];varsum=result.reduce(function(prev,cur){returncur.score+prev;},0);console.log(sum)//60
