reduce()办法对数组中的每一个元素执行一个reducer函数(由你提供),从而失去一个繁多的输入值。
reduce()
办法将一个数组中的所有元素还原成一个繁多的输入值,输入值能够是数字、对象或字符串。 reduce()
办法有两个参数,第一个是回调函数,第二个是初始值。
回调函数
回调函数在数组的每个元素上执行。回调函数的返回值是累加后果,并作为下一次调用回调函数的参数提供。回调函数带有四个参数。
- Accumulator(累加器)——累加器累加回调函数的返回值。
- Current Value(以后值)——解决数组的以后元素。
- Current Index(以后索引)——解决数组以后元素的索引。
- Source Array(源数组)
Current Index
和 Source Array
是可选的。
初始值
如果指定了初始值,则将累加器设置为 initialValue
作为初始元素。否则,将累加器设置为数组的第一个元素作为初始元素。
arr.reduce(callback(accumulator, currentValue[,index[,array]])[, initialValue])
在上面的代码片段中,第一个累加器(accumulator
)被调配了初始值0。currentValue
是正在解决的 numbersArr
数组的元素。在这里,currentValue
被增加到累加器,在下次调用回调函数时,会将返回值作为参数提供。
const numbersArr = [67, 90, 100, 37, 60];const total = numbersArr.reduce(function(accumulator, currentValue){ console.log("accumulator is " + accumulator + " current value is " + currentValue); return accumulator + currentValue;}, 0);console.log("total : "+ total);
输入
accumulator is 0 current value is 67accumulator is 67 current value is 90accumulator is 157 current value is 100accumulator is 257 current value is 37accumulator is 294 current value is 60total : 354
JavaScript reduce用例
1.对数组的所有值求和
在上面的代码中,studentResult
数组具备5个数字。应用 reduce()
办法,将数组缩小为单个值,该值将 studentResult
数组的所有值和后果调配给 total
。
const studentResult = [67, 90, 100, 37, 60];const total = studentResult.reduce((accumulator, currentValue) => accumulator +currentValue, 0);console.log(total); // 354
2.对象数组中的数值之和
通常,咱们从后端获取数据作为对象数组,因而,reduce()
办法有助于治理咱们的前端逻辑。在上面的代码中,studentResult
对象数组有三个科目,这里,currentValue.marks
取了 studentResult
对象数组中每个科目的分数。
const studentResult = [ { subject: '数学', marks: 78 }, { subject: '物理', marks: 80 }, { subject: '化学', marks: 93 }];const total = studentResult.reduce((accumulator, currentValue) => accumulator + currentValue.marks, 0);console.log(total); // 251
3.展平数组
“展平数组”是指将多维数组转换为一维。在上面的代码中,twoDArr
2维数组被转换为 oneDArr
一维数组。此处,第一个 [1,2]
数组调配给累加器 accumulator
,而后 twoDArr
数组的其余每个元素都连贯到累加器。
const twoDArr = [ [1,2], [3,4], [5,6], [7,8] , [9,10] ];const oneDArr = twoDArr.reduce((accumulator, currentValue) => accumulator.concat(currentValue));console.log(oneDArr);// [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ]
4.按属性分组对象
依据对象的属性,咱们能够应用 reduce()
办法将对象数组分为几组。通过上面的代码片段,你能够分明地了解这个概念。这里,result
对象数组有五个对象,每个对象都有 subject
和 marks
属性。如果分数大于或等于50,则该主题通过,否则,主题失败。 reduce()
用于将后果分组为通过和失败。首先,将 initialValue
调配给累加器,而后 push()
办法在查看条件之后将以后对象增加到 pass
和 fail
属性中作为对象数组。
const result = [ {subject: '物理', marks: 41}, {subject: '化学', marks: 59}, {subject: '高等数学', marks: 36}, {subject: '利用数学', marks: 90}, {subject: '英语', marks: 64},];let initialValue = { pass: [], fail: []}const groupedResult = result.reduce((accumulator, current) => { (current.marks >= 50) ? accumulator.pass.push(current) : accumulator.fail.push(current); return accumulator;}, initialValue);console.log(groupedResult);
输入
{ pass: [ { subject: ‘化学’, marks: 59 }, { subject: ‘利用数学’, marks: 90 }, { subject: ‘英语’, marks: 64 } ], fail: [ { subject: ‘物理’, marks: 41 }, { subject: ‘高等数学’, marks: 36 } ]}
5.删除数组中的反复项
在上面的代码片段中,删除了 plicatedArr
数组中的反复项。首先,将一个空数组调配给累加器作为初始值。accumulator.includes()
查看 duplicatedArr
数组的每个元素是否曾经在累加器中可用。如果 currentValue
在累加器中不可用,则应用 push()
将其增加。
const duplicatedsArr = [1, 5, 6, 5, 7, 1, 6, 8, 9, 7];const removeDuplicatedArr = duplicatedsArr.reduce((accumulator, currentValue) => { if(!accumulator.includes(currentValue)){ accumulator.push(currentValue); } return accumulator;}, []);console.log(removeDuplicatedArr);// [ 1, 5, 6, 7, 8, 9 ]
总结
在本文中,咱们探讨了数组 reduce()
办法。首先介绍 reduce()
办法,而后,应用一个简略的示例探讨其行为。最初,通过示例探讨了 reduce()
办法最常见的五个用例。如果你是JavaScript的初学者,那么本文将对你有所帮忙。
起源:https://medium.com/javascript-in-plain-english,作者:wathsala danthasinghe,翻译:公众号《前端全栈开发者》