一、概念
reduce会对数组进行遍历,回调函数的两个值分别表示,逻辑操作的累积结果以及当前值,常用于对数组等进行累加。
reduce函数语法
arr.reduce(function (previousValue, currentValue) {
/* 逻辑函数 */
}, initialValue)
arr:表示对某个数组进行遍历
previousValue:对数组的累加结果,需要在函数体中return
currentValue:arr数组的当前遍历项
initialValue:表示起始值,选填,不填的话,previousValue为数组第一项,currentValue为数组第二项;填的话,previousValue为initialValue,currentValue为数组第一项。
二、常见的几种应用场景
①、对数组累加求和
let arr = [1, 2, 3, 4, 5, 6]
var sum = 0
sum = arr.reduce(function (sum, cur) {
sum += cur
return sum
}, 0)
console.log(sum)
②、对象数组中的数值之和
let arr2 = [{
subject: '数学',
marks: 78
},
{
subject: '物理',
marks: 80
},
{
subject: '化学',
marks: 93
}
]
let sum = 0
sum = arr2.reduce(function (sum, cur) {
sum += cur.marks
return sum
}, 0)
console.log('分数之和是', sum)
③、展平数组(将多维数组转换为一维)
let arr3 = [ [1,2], [3,4], [5,6], [7,8] , [9,10] ];
let sum = []
sum = arr3.reduce(function(sum,arr){
// sum.push(...arr)两种都可以
sum = sum.concat(arr)
return sum
},[])
console.log(sum)
④、按属性分组对象(分数大于等于50分的为通过,低于50分的为不通过)
let arr3 = [{
subject: '物理',
marks: 41
},
{
subject: '化学',
marks: 59
},
{
subject: '高等数学',
marks: 36
},
{
subject: '应用数学',
marks: 90
},
{
subject: '英语',
marks: 64
},
];
let obj = {
pass: [],
fail: []
}
obj = arr3.reduce(function (obj, cur) {
cur.marks >= 50 ? obj.pass.push(cur) : obj.fail.push(cur)
return obj
}, obj)
console.log(obj)
⑤、假设集合A={a, b},集合B={0, 1, 2},则两个集合的笛卡尔积为{(a, 0), (a, 1), (a, 2), (b, 0), (b, 1), (b, 2)}。求当A={a, b, …, n}, B={0, 1, 2, …, n}时的笛卡尔积.
let arr = [
[{
a: 1,
b: 2
}, 'c'],
[1, 2, 3],
[7, 8, 9]
]
let arrs
arr.reduce(function (sum, cur) {
console.log(sum, 'sum-----')
console.log(cur, 'cur-----')
arrs = []
for (var i = 0; i < sum.length; i++) {
for (var j = 0; j < cur.length; j++) {
let temparr = []
console.log(Array.isArray(sum[i]))
Array.isArray(sum[i]) ? temparr = temparr.concat(sum[i]) : temparr.push(sum[i])
temparr.push(cur[j])
arrs.push(temparr)
}
}
return arrs
})
console.log(arrs,'arrs------------')