DDR爱好者之家
文章推薦指數: 80 %
唱片信息:专辑名称:FinalEncounter演唱歌手:张国荣专辑风格:流行歌曲发行时间:1989、2015(SACD)发行 ... Encounter》2015[FLAC+CUE/整轨],【SACD】张国荣《Final.
无损音乐
高清影音
高清电影
高清MV
韩剧美剧
互联网资源
福利资源
Q币活动
Q钻活动
软件下载
破解软件
游戏软件
易语言源码
安卓软件
QQ软件
游戏教程
LOL资讯视频
CF活动大全
LOL最新活动
DNF活动资讯
王者荣耀
技术教程
QQ教程
网络教程
电子商务
营销策划
淘客微商
运营推广
站长资源
网页制作
网络编程
脚本专栏
数据库
服务器
操作系统
网站运营
平面设计
电脑基础
无损音乐
高清电影
高清MV
韩剧美剧
资讯频道
福利资源
Q币活动
Q钻活动
王者荣耀
QQ教程
网络教程
破解软件
游戏软件
安卓软件
QQ软件
易语言源码
站长资源
网页制作
网络编程
脚本专栏
数据库
服务器
操作系统
网站运营
平面设计
电脑基础
Javascript数组方法reduce的妙用之处分享
Javascript数组方法reduce的妙用之处分享
站长资源2022/5/10
佚名
561538
56
DDR爱好者之家DesignBy杰米
前言
Javascript数组方法中,相比map、filter、forEach等常用的迭代方法,reduce常常被我们所忽略,今天一起来探究一下reduce在我们实战开发当中,能有哪些妙用之处,下面从reduce语法开始介绍。
语法
array.reduce(function(accumulator,arrayElement,currentIndex,arr),initialValue)
若传入初始值,accumulator首次迭代就是初始值,否则就是数组的第一个元素;后续迭代中将是上一次迭代函数返回的结果。
所以,假如数组的长度为n,如果传入初始值,迭代次数为n;否则为n-1。
比如实现数组arr=[1,2,3,4]求数组的和
letarr=[1,2,3,4];
arr.reduce(function(pre,cur){returnpre+cur});//return10
实际上reduce还有很多重要的用法,这是因为累加器的值可以不必为简单类型(如数字或字符串),它也可以是结构化类型(如数组或对象),这使得我们可以用它做一些其他有用的事情,比如:
将数组转换为对象
展开更大的数组
在一次遍历中进行两次计算
将映射和过滤函数组合
按顺序运行异步函数
将数组转化为对象
在实际业务开发中,你可能遇到过这样的情况,后台接口返回的数组类型,你需要将它转化为一个根据id值作为key,将数组每项作为value的对象进行查找。
例如:
constuserList=[
{
id:1,
username:'john',
sex:1,
email:'[email protected]'
},
{
id:2,
username:'jerry',
sex:1,
email:'[email protected]'
},
{
id:3,
username:'nancy',
sex:0,
email:''
}
];
如果你用过lodash这个库,使用_.keyBy这个方法就能进行转换,但用reduce也能实现这样的需求。
functionkeyByUsernameReducer(acc,person){
return{...acc,[person.id]:person};
}
constuserObj=peopleArr.reduce(keyByUsernameReducer,{});
console.log(userObj);
将小数组展开成大数组
试想这样一个场景,我们将一堆纯文本行读入数组中,我们想用逗号分隔每一行,生成一个更大的数组名单。
constfileLines=[
'InspectorAlgar,InspectorBardle,Mr.Barker,InspectorBarton',
'InspectorBaynes,InspectorBradstreet,InspectorSamBrown',
'MonsieurDubugue,BirdyEdwards,InspectorForbes,InspectorForrester',
'InspectorGregory,InspectorTobiasGregson,InspectorHill',
'InspectorStanleyHopkins,InspectorAthelneyJones'
];
functionsplitLineReducer(acc,line){
returnacc.concat(line.split(/,/g));
}
constinvestigators=fileLines.reduce(splitLineReducer,[]);
console.log(investigators);
//[
//"InspectorAlgar",
//"InspectorBardle",
//"Mr.Barker",
//"InspectorBarton",
//"InspectorBaynes",
//"InspectorBradstreet",
//"InspectorSamBrown",
//"MonsieurDubugue",
//"BirdyEdwards",
//"InspectorForbes",
//"InspectorForrester",
//"InspectorGregory",
//"InspectorTobiasGregson",
//"InspectorHill",
//"InspectorStanleyHopkins",
//"InspectorAthelneyJones"
//]
我们从长度为5的数组开始,最后得到一个长度为16的数组。
另一种常见增加数组的情况是flatMap,有时候我们用map方法需要将二级数组展开,这时可以用reduce实现扁平化
例如:
Array.prototype.flatMap=function(f){
constreducer=(acc,item)=>acc.concat(f(item));
returnthis.reduce(reducer,[]);
}
constarr=["今天天气不错","","早上好"]
constarr1=arr.map(s=>s.split(""))
//[["今","天","天","气","不","错"],[""],["早","上","好"]]
constarr2=arr.flatMap(s=>s.split(''));
//["今","天","天","气","不","错","","早","上","好"]
在一次遍历中进行两次计算
有时我们需要对数组进行两次计算。
例如,我们可能想要计算数字列表的最大值和最小值。
我们可以通过两次通过这样做:
constreadings=[0.3,1.2,3.4,0.2,3.2,5.5,0.4];
constmaxReading=readings.reduce((x,y)=>Math.max(x,y),Number.MIN_VALUE);
constminReading=readings.reduce((x,y)=>Math.min(x,y),Number.MAX_VALUE);
console.log({minReading,maxReading});
//{minReading:0.2,maxReading:5.5}
这需要遍历我们的数组两次。
但是,有时我们可能不想这样做。
因为.reduce()让我们返回我们想要的任何类型,我们不必返回数字。
我们可以将两个值编码到一个对象中。
然后我们可以在每次迭代时进行两次计算,并且只遍历数组一次:
constreadings=[0.3,1.2,3.4,0.2,3.2,5.5,0.4];
functionminMaxReducer(acc,reading){
return{
minReading:Math.min(acc.minReading,reading),
maxReading:Math.max(acc.maxReading,reading),
};
}
constinitMinMax={
minReading:Number.MAX_VALUE,
maxReading:Number.MIN_VALUE,
};
constminMax=readings.reduce(minMaxReducer,initMinMax);
console.log(minMax);
//{minReading:0.2,maxReading:5.5}
将映射和过滤合并为一个过程
还是先前那个用户列表,我们希望找到没有电子邮件地址的人的用户名,返回它们用户名用逗号拼接的字符串。
一种方法是使用两个单独的操作:
获取过滤无电子邮件后的条目
获取用户名并拼接
将它们放在一起可能看起来像这样:
functionnotEmptyEmail(x){
return!!x.email
}
functionnotEmptyEmailUsername(a,b){
returna"htmlcode">
functionnotEmptyEmail(x){
return!!x.email
}
functionnotEmptyEmailUsername(usernameAcc,person){
return(notEmptyEmail(person))
"color:#ff0000">按顺序运行异步函数
我们可以做的另一件事.reduce()是按顺序运行promises(而不是并行)。
如果您对API请求有速率限制,或者您需要将每个prmise的结果传递到下一个promise,reduce可以帮助到你。
举一个例子,假设我们想要为userList数组中的每个人获取消息。
functionfetchMessages(username){
returnfetch(`https://example.com/api/messages/${username}`)
.then(response=>response.json());
}
functiongetUsername(person){
returnperson.username;
}
asyncfunctionchainedFetchMessages(p,username){
//Inthisfunction,pisapromise.Wewaitforittofinish,
//thenrunfetchMessages().
constobj=awaitp;
constdata=awaitfetchMessages(username);
return{...obj,[username]:data};
}
constmsgObj=userList
.map(getUsername)
.reduce(chainedFetchMessages,Promise.resolve({}))
.then(console.log);
//{glestrade:[…],mholmes:[…],iadler:[…]}
async函数返回一个Promise对象,可以使用then方法添加回调函数。
当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。
请注意,在此我们传递Promise作为初始值Promise.resolve(),我们的第一个API调用将立即运行。
下面是不使用async语法糖的版本
functionfetchMessages(username){
returnfetch(`https://example.com/api/messages/${username}`)
.then(response=>response.json());
}
functiongetUsername(person){
returnperson.username;
}
functionchainedFetchMessages(p,username){
//Inthisfunction,pisapromise.Wewaitforittofinish,
//thenrunfetchMessages().
returnp.then((obj)=>{
returnfetchMessages(username).then(data=>{
return{
...obj,
[username]:data
}
})
})
}
constmsgObj=peopleArr
.map(getUsername)
.reduce(chainedFetchMessages,Promise.resolve({}))
.then(console.log);
//{glestrade:[…],mholmes:[…],iadler:[…]}
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。
js数组reduce,js数组去重reduce,js,数组reduce
DDR爱好者之家DesignBy杰米
广告合作:本站广告合作请联系QQ:858582申请时备注:广告合作(否则不回)
免责声明:本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除!
上一篇
对node通过fs模块判断文件是否是文件夹的实例讲解
下一篇
利用node判断打开的是文件还是文件夹的实例
DDR爱好者之家DesignBy杰米
评论“Javascript数组方法reduce的妙用之处分享”
再想想
暂无评论...
ddrfans.com
DDR爱好者之家
8,675无损音乐
1,324高清电影
213破解软件
70,141收录资讯
最新文章
群星.2012-英皇七十周年音乐强阵专辑2CD【英
2022/5/10
64
陈明.1998-为了爱【中唱】【FLACCUE】
2022/5/10
62
【古典音乐】莱纳德·斯拉特金《霍尔斯特-行
2022/5/10
53
【古典音乐】贝尔曼《李斯特-第一、二钢琴协
2022/5/10
28
【古典音乐】图蕾克《巴赫-哥德堡变奏曲》(
2022/5/10
25
热门网址
DDR爱好者之家
杰晶网络
电子商务网
杰米小屋
热门标签
1080P高清(5)
高清电影(5)
百度云盘(5)
网盘下载(4)
破解软件(4)
绿色软件(4)
磁力链接(3)
吕布加强(3)
2021防沉迷(2)
福利资源(2)
种子资源(2)
黑钻活动(2)
防沉迷(2)
18岁身份证(2)
蓝雨6080(2)
WPS会员(2)
刷图排行(1)
网盘限速(1)
鬼灭之刃(1)
无限申请QQ(1)
免费韩国漫画(1)
老司机番号(1)
免费动漫(1)
一句话新闻收集国内外高清电影资源、无损音乐下载、游戏辅助教程、福利资源、网络教程的综合性网站。
说起最近最火爆的游戏,肯定就是CDPR推出的大作《赛博朋克2077》了。
得益于《巫师3》等前作树立起的良好口碑、全程中文配音、炸裂级别的宣传片、迷人的近未来开放世界设定、甚至是有意无意的跳票炒作以及数不胜数的Bug,这无穷无尽的Bug甚至还搞出了PS、Xbox版可退款的大新闻……这些元素一起发酵,让《赛博朋克2077》在国内的热度达到了一个空前的程度——这款3A大作,竟然出圈了。
DDR爱好者之家DesignBy杰米
搜索
关键字搜索
热门推荐:
搜索
关键字搜索
热门推荐:
无损音乐
卡黄钻绿钻
激活密钥
延伸文章資訊
- 1张国荣全集140CD珍藏版[FLAC 百度云] - 无损精品音乐下载
[华语音乐] 张国荣- 张国荣全集140CD珍藏版[FLAC 百度云] ... 张国荣,亚洲演艺界顶级巨星,他是一位在歌坛和影坛都取得很高成就的歌手、演员和音乐人;
- 2DDR爱好者之家
唱片信息:专辑名称:FinalEncounter演唱歌手:张国荣专辑风格:流行歌曲发行时间:1989、2015(SACD)发行 ... Encounter》2015[FLAC+CUE/整轨],【...
- 3张国荣音乐合集【全部104专辑CD FLAC+APE+AAC】 - 夕阳小站
张国荣音乐合集【全部104专辑CD FLAC+APE+AAC】. 作者:夕阳小编 日期:2020-07-01. 接下来为大家带来的是哥哥张国荣的歌曲全集的百度云资源,希望大家能够喜欢这部 ...
- 4張國榮音樂合集1978-2007 [140CD, FLAC]
張國榮(Leslie Cheung Kwok Wing,1956年9月12日-2003年4月1日),已故香港知名藝人。他在大中華地區乃至亞洲均擁有廣泛的影響力。
- 5張國榮告別演唱會cd光盤經典粵語老歌精選車載cd無損金碟片
... 未聊聊討論,直接任意扣星星給予評價,將同樣給予回覆! ◇可接受者再下標~下標後無法取消訂單喔~ 購買張國榮告別演唱會cd光盤經典粵語老歌精選車載cd無損金碟片.