reduce实现递归查找属性https://blog.csdn.net/lihefei...letpeoples={zhangsan:{name:'张三',height:170,child:{name:'张笑笑'},},lisi:{name:'李斯',weight:200,wife:{name:'杨玉环'},},wagnwu:{name:'王舞',age:21,},};letstr='lisi.wife.name';letpropArr=str.split('.');letresult=propArr.reduce((prev,next)=>{returnprev[next]?prev[next]]:null;},人民);控制台日志(结果);//杨玉环使用reduce()方法处理树结构数据https://www.cnblogs.com/dhui/...array.reduce(function(prev,cur,index,array){...},init);回调函数中的参数:必须有prev。表示调用回调时的返回值,或者初始值init。当前必需。指示当前元素。索引是可选的。指示当前元素的索引。array表示原始数组。初始化可选。初始值,作为回调函数第一次调用的第一个参数。常用参数:prev和cur注:回调函数第一次执行时,prev和cur的取值有两种情况:如果在调用reduce()时提供初始值init,则prev取init值,cur取数组中的第一个值,此时索引从0开始;如果不提供初始值init,则prev取数组中的第一个值,cur取数组中的第二个值,此时索引从1开始。//用&&符号判断+执行简直美死了{constarr=['ab','v','d','ab','h','e','dc','e','e','f']constnewArr=arr.reduce(function(prev,cur){!prev.includes(cur)&&prev.push(cur)returnprev},[])console.log(newArr)//["ab","v","d","h","e","dc","f"]}{///初始值设置为{},使用reduce来满足统计函数letnames=['Alice','Bob','Tiff','Bruce','Alice']letcountedNames=names.reduce((allNames,name)=>{if(nameinallNames){allNames[name]++}else{allNames[name]=1}returnallNames},{})console.log(countedNames);//countedNamesis://{'Alice':2,'Bob':1,'Tiff':1,'Bruce':1}}//使用reduce实现属性值分组letpeople=[{name:'Alice',age:21},{name:'Max',age:20},{name:'Jane',age:20}];functiongroupBy(objectArray,property){returnobjectArray.reduce((acc,obj)=>{letkey=obj[property]如果(!acc[key]){acc[key]=[]}acc[key].push(obj)returnacc},{})}letgroupedPeople=groupBy(people,'age');console.log(groupedPeople);//groupedPeople是://{//20:[//{name:'Max',age:20},//{name:'Jane',age:20}//],//21:[{name:'Alice',age:21}]//}}{//返回对象中的属性为数组的情况//friends-对象数组//其中对象字段“books”是最喜欢的书的列表让friends=[{name:'Anna',books:['Bible','HarryPotter'],age:21},{name:'Bob',books:['战争与和平','罗密欧与朱丽叶'],age:26},{name:'Alice',books:['TheLordoftheRings','TheShining'],age:18}]//allbooks-将包含所有朋友的书的列表+//initialValue中包含的附加列表letallbooks=friends.reduce(function(accumulator,currentValue){return[...accumulator,...currentValue.books]},[])//allbooks=[//'圣经','哈利波特','战争与和平',//'罗密欧与朱丽叶','指环王',//'闪灵'//]}{constnumbers=[-5,6,2,0,];constdoubledPositiveNumbers=numbers.reduce((accumulator,currentValue)=>{constdoubled=(num)=>{accumulator.push(num*2);}//判断,满脚条即执行势数currentValue>0&&doubled(currentValue);返回累加器;},[]);控制台日志(doubledPositiveNumbers);//[12,4]}{/***从可以返回承诺的函数数组运行承诺*以链式方式**@param{array}arr-承诺arr*@return{Object}承诺对象*/functionrunPromiseInSequence(arr,input){returnarr.reduce((promiseChain,currentFunction)=>promiseChain.then(currentFunction),//这里的Promise.resolve(input)相对于初始值Promise.resolve(input))}//promisefunction1functionp1(a){returnnewPromise((resolve,reject)=>{console.log(a);resolve(a*5)})}//promise函数2functionp2(a){returnnewPromise((resolve,reject)=>{console.log(a);resolve(a*2)})}//函数3-将是通过.then()functionf3(a){console.log(a);包装在已解决的承诺中returna*3}//promisefunction4functionp4(a){returnnewPromise((resolve,reject)=>{console.log(a);resolve(a*4)})}constpromiseArr=[p1,p2,f3,p4]runPromiseInSequence(promiseArr,10).then(console.log)//1200}{//用于组合的构建块constdouble=x=>x+xconsttriple=x=>3*xconstquadruple=x=>4*x//函数组合启用gpipefunctionalityconstpipe=(...functions)=>input=>functions.reduce((acc,fn)=>fn(acc),//这里的输入相当于初始值input)//用于乘法的组合函数具体值constmultiply6=pipe(double,triple)constmultiply9=pipe(triple,triple)constmultiply16=pipe(quadruple,quadruple)constmultiply24=pipe(double,triple,quadruple)//用法multiply6(6)//36multiply9(9)//81multiply16(16)//256multiply24(10)//240}{if(!Array.prototype.mapUsingReduce){Array.prototype.mapUsingReduce=function(callback,thisArg){返回this.reduce((mappedArray,currentValue,index,array)=>{mappedArray[index]=callback.call(thisArg,currentValue,index,array)returnmappedArray},[])}}[1,2,,3].mapUsingReduce((currentValue,index,array)=>currentValue+index+array.length)//[5,7,,10]}
