




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
今天你将学习如何使用**最强大的**JavaScript函数。数组归约“Array.reduce是最强大的
JavaScriptFunction.
时期。
”reduce有什么作用?为何如此强大?这是reduce的技术定义......Atotype.reduce()reduce()方法对数组的每个元素执行(您提供的)reducer函数,从而产生单个输出值。如果你问我的话,这没什么帮助,所以让我们边做边学1.求所有数字的总和(使用reduce)[3,2.1,5,8].reduce((total,number)=>total+number,0)//loop1:0+3//loop2:3+2.1//loop3:5.1+5//loop4:10.1+8//returns18.12.求所有相乘数的总和[3,2.1,5,8].reduce((total,number)=>total*number,1)如图所示,将数组中的所有数字相加或相乘非常容易。但是,
-我说过,reduce是所有JS中最强大的函数。假设我们有3、4、10和60。假设我们想要获得一些值。或者,更具体地说,我们想要filter这些值,并且只返回小于10的值。通常,我们可以简单地使用该filter函数,只返回小于10的数字。3.使用reduce进行Array.Filter[3,4,10,60].filter(number=>number<10)好吧,使用reduce——我们可以做同样的事情。[3,4,10,60].reduce((list,number)=>
number<10
?[...list,number]
:list,[])拉拉,我们用reduce替换了过滤器-很酷,但说实话。这仍然不能证明reduce它是所有JavaScript中最强大的功能。如果我告诉你,我们可以继续沿着这条路走,并使用reduce替换JavaScript中的几乎所有数组函数,会怎么样?4.
重新创建Array.some使用Array.reduce[3,4,10,50].some(number=>number<50)//returnstrue(Wehavesomenumbersinthearrayarelessthan50)使用reduce,我们只需将初始值设置为false。如果条件已经为真,那么我们返回该条件。如果条件尚不成立,那么我们检查当前数字是否满足我们的条件。[3,4,10,50].reduce((condition,number)=>
condition===true
?condition
:number<50,false)请注意,这次我们以bool(false)作为初始值,而不是使用数字或数组。我们现在已经求和、相乘、过滤并重新创建了一些(也称为使用reduce有条件地检查数组上的某些内容)。我们还可以继续Array.every使用using替换该函数,但由于这与替换usingArray.reduce类似,因此我们也可以轻松地做到这一点。Array.someArray.reduce5.Array.join4.使用
怎么样Array.reduce?替换Array.join为Array.reduce['truck','car','people'].join('-')//"truck-car-people"使用Array.reduce我们可以编写以下代码['truck','car','people'].reduce((text,word)=>`${text}-${word}`,'')//"-truck-car-people"请注意,输出的前面有一个破折号。作为函数的第一个参数接受的回调函数Array.reduce接受更多参数。我们可以使用第三个接受的参数来跟踪我们index的reduce函数['truck','car','people'].reduce((text,word,index)=>
index===0
?word
:`${text}-${word}`,'')//"truck-car-people"设置第三个参数后,这个reduce函数现在将按照原始Array.join函数的方式运行至此,我们已经使用reduce进行替换了。Array.map数组过滤器数组.every,数组.some数组连接6.使用Reduce进行Array.concat那么连接呢?在哪里可以将“1”、“2”和“3”的数组与另一个数组连接起来?[1,2,3].concat(['hey','world','mars'])//[1,2,3,'hey','world','mars']您将如何连接或组合数组reduce?[[1,2,3],['hey','world','mars']].reduce(
(list,array)=>[...list,...array],[])//[1,2,3,'hey,'world','mars']使用组合数组的好处Array.reduce是我们可以“连接”任意数量的数组。简单地说,通过传入更多数组,我们将使用reduce自动组合(也称为连接)它们。这样,我们就复制了Array.concat使用Array.reduce让我们再看几个例子。首先,让我们创建一些人。letsarah={name:'sarah',email:'sarah@',id:1}lettim={name:'tim',email:'tim@',id:2}letlen={name:'len',email:'len@',id:3}7.使用按姓名对人员进行分组Array.reduce当我们按名字对人进行分组时我们想要的示例people.len//GetsLen//{name:'len',email:'len@',id:3}people.sarah//Getssarah//{name:'sarah',email:'sarah@',id:1}使用reduce按姓名对人员进行分组将reduce函数的初始值设置为一个对象构建一个对象,其中关键是人的名字([])该值为person对象([]:person)示例(这不起作用)letpeople=[sarah,tim,len].reduce((people,person)=>{
[]:person,
...people},{})在上面的例子中我们会得到一个错误未捕获的语法错误:意外的标记“:”每当我们使用简写函数返回一个对象时,我们需要将其括在括号中将返回对象的方括号括在圆括号中以修复错误letpeople=[sarah,tim,len].reduce((people,person)=>({
[]:person,
...people}),{})啦啦,我们现在有一个人员对象,其中人员按姓名分组如果我们去,people.len我们会得到lenpeople.len//{name:'len',email:'len@',id:3}如果我们去的话people.sarah我们会得到莎拉people.sarah//{name:'sarah',email:'sarah@',id:1}如果我们去的话people.tim我们会得到蒂姆people.tim//{name:'tim',email:'tim@',id:2}如果我们想要我们所有的people?//people{
sarah:{name:'sarah',email:'sarah@',id:1},
tim:{name:'tim',email:'tim@',id:2},
len:{name:'len',email:'len@',id:3},}8.使用Reduce按给定键提取值数组更重要的是,如果我们只想获取人员的姓名怎么办?letnames=[sarah,tim,len].reduce((names,person)=>[
...names,
],[])//['sarah','tim','len']如果我们只想获取人们的电子邮件怎么办?letemails=[sarah,tim,len].reduce((emails,person)=>[
...emails,
person.email],[])//['sarah@','tim@','len@']9.使用Reduce展平多层嵌套数组更重要的是,如果我们有一个嵌套数组的数组怎么办?letlist_of_arrays=[
['sub_one','sub_two','sub_three'],
[
['nested_sub_one','nested_sub_two'],
['nested_sub_three','nested_sub_four']
],
'one',
'two',
'three']让我们使用数组列表,当然还可以使用reducelist_of_arrays.reduce((flattened,item)=>{
if(Array.isArray(item)===false){
return[...flattened,item]
}
if(Array.isArray(item)&&Array.isArray(item[0])){
return[
...flattened,
....item.reduced((flatten,nested_list)=>[...flatten,...nested_list,[])
]
]
}
return[...flattened,...item]},[])啦啦,我们已经扁平化了多层嵌套数组的列表。输出["sub_one","sub_two","sub_three","nested_sub_one","nested_sub_two","nested_sub_three","nested_sub_four","one","two","three"]笔记:我们只处理最多3层深度的嵌套子数组,但是您当然可以在该函数上花费更多时间,并使用递归来非常简单地使用reduce来展平无限嵌套层深的数组。更强大的Reduce用例好吧,现在让我们深入研究一些更强大但不常用的用例Array.reduce。10.在字符串上应用格式化程序我将从一系列字符串开始。letstrings=['cool-link','helloworldofjavascript','goodbye,itsbeenswell']接下来让我们创建一个formatters.
通常,我将这些称为过滤器-但它们并不是真正的过滤器。他们只是格式化字符串。这些格式化程序实际上是回调函数。首先,我们将创建一个破折号到空格格式化程序(用空格替换破折号)。将使用正则表达式来实现此格式化程序。letdashesToSpaces=str=>str.replace(/-/g,'')接下来,我们将创建一个大写字符串格式化程序。letcapitalize=str=>`${str[0].toUpperCase()}${str.slice(1)}`然后,我们将创建一个字符串限制器格式化程序。如果字符串大于给定长度,则用三个点替换该长度限制之后的字符。letlimiter=str=>str.length>10?`${str.slice(0,10)}...`:strformatters最后,我们将使用所有字符串格式化程序创建一个数组。letformatters=[dashesToSpaces,capitalize,limiter]请记住,我们有字符串数组。letstrings=['cool-link','helloworldofjavascript','goodbye,itsbeenswell']我们的目标:我们的目标是将格式化程序数组中的每个格式化程序应用到字符串数组中的每个字符串上。使用reduce,我们可以简单地这样做!strings.reduce((list,str)=>[
formatters.reduce((string,format)=>format(string),str),
...list
],[])_就像这样,我们使用reduce在字符串数组上应用格式化程序数组。_原始字符串数组['cool-link','helloworldofjavascript','goodbye,itsbeenswell']输出(使用reduce应用字符串格式化程序后)["Goodbye,i...","Helloworl...","Coollink"]11.按房间对学生进行分组(使用reduce)首先我们创建一些学生letstudents=[
{name:'Sally',room:'A'},
{name:'tim',room:'A'},
{name:'nick',room:'B'},
{name:'rick',room:'C'},
{name:'sarah',room:'B'},
{name:'pam',room:'C'}]我们想按学生的房间对他们进行分组所以我们要做的就是使用students.reduce.students.reduce((class_rooms,student)=>({}),{})请注意,我们在再次隐式返回的对象周围使用了括号。当我们使用简写函数返回一个对象时,我们必须使用({})语法-如果我们尝试直接返回一个对象而不进行包装,()我们将收到错误。接下来,我们要使用学生房间作为钥匙:students.reduce((rooms,student)=>({
...rooms,
[student.room]:rooms[student.room]
?[...rooms[student.room],student]
:[student]}),{})现在,我们的学生按房间/班级分组。{
A:[{name:'sally',room:'A'},{name:'tim',room:'A'}],
B:[{name:'nick',room:'B'},{name:'sarah',room:'B'}],
C:[{name:'rick',room:'C'},{name:'pam',room:'C'}],}我们已经成功地按学生的房间对学生进行了分组-这就是我们按归约进行分组的方式。这就是我对reduce的了解。我想最大的收获是,reduce是一种超级方法-确实是如此!使用reduce可以做任何其他数组方法可以做的事情。Array.filter.map.filter.forEach您可以使用单个reduce函数来完成相同的目标。如果您需要按键对一大堆对象进行分组,请使用reduce。如果您需要提取与给定键相关的值?使用reduce。如果您需要应用多个过滤器,但又不想通过多次迭代同一数组来提高时间复杂度-请使用reduce。如果您想展平嵌套数组的数组,其中每个嵌套数组可能有更多嵌套数组,而每个嵌套数组也可能没有任何嵌套数组?使用reduce。如果你需要对一些数字进行求和、乘以一些数字、减去总和或进行任何类型的算术——reduce会再次起作用。如果需要组合一些数组怎么办?使用reduce。如果您需要组合一些对象怎么办?使用reduce。如果您想拥有一种方法,您知道它可以完成所有工作,并且让您感觉作为软件工程师更加强大和高效,该怎么办?使用reduce!在我看来,forEach是JavaScript生态系统中最被高估的方法,reduce是JS生态系统中最被低估的方法。作为最后一个例子,让我们以这个最后的例子来说明reduce有多牛。[{name:'CleanCodeStudio'},{belief:'Simplify!'},{should_follow:'Si,senor!'}].reduce((last
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年系统分析师考试大纲介绍:试题及答案
- 四年级信息技术上册 精益求精话美食教学设计 浙江摄影版
- 2024年系统分析师考试的多元化备考试题及答案
- 绿色建筑理念与二级建造师考试试题及答案
- 海外教育项目合作合同
- 探究2024园艺师考试的影响因素试题及答案
- 2024年学年八年级语文上册 第八单元 外国短篇小说选读 第28课《变色龙》教学设计2 沪教版五四制
- 2024年农产品品牌营销的策略研究试题及答案
- 内蒙古鄂尔多斯市达拉特旗九年级化学上册 3.3 燃烧条件与灭火原理教学设计 (新版)粤教版
- 走进2024年食品安全员考试试题及答案
- 工程项目跟踪审计送审资料清单
- 中文产品手册机架效果器tcelectronic-triplec manual chinese
- 新概念英语第三册Lesson8 课件
- 人卫版内科学第九章白血病(第3节)
- 食堂设备维修记录
- DB65∕T 4357-2021 草原资源遥感调查技术规程
- 幼儿园绘本:《闪闪的红星》 红色故事
- 植物生理学_第七版_潘瑞炽_答案
- FZ∕T 60021-2021 织带产品物理机械性能试验方法
- 云南大学研究业绩认定与折算细则
- DG∕T 154-2022 热风炉
评论
0/150
提交评论