语法
arr.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
参数
- callback
执行数组中每个值 (如果没有提供
initialValue则第一个值除外)的函数 - accumulator
累计器累计回调的返回值; 它是上一次调用回调时返回的累积值,或
initialValue - currentValue 数组中正在处理的元素
- index(可选)
数组中正在处理的当前元素的索引。 如果提供了
initialValue,则起始索引号为0,否则从索引1起始。 - array(可选) 调用reduce()的数组
- initialValue(可选)
作为第一次调用
callback函数时的第一个参数的值。 如果没有提供初始值,则将使用数组中的第一个元素。 在没有初始值的空数组上调用 reduce 将报错。
描述
reduce为数组中的每一个元素依次执行callback函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:
accumulator 累计器currentValue 当前值currentIndex 当前索引array 数组回调函数第一次执行时,accumulator和currentValue的取值有两种情况:如果调用reduce()时提供了initialValue,accumulator取值为initialValue,currentValue取数组中的第一个值;如果没有提供initialValue,那么accumulator取数组中的第一个值,currentValue取数组中的第二个值。
如果数组为空且没有提供initialValue,会抛出[TypeError]。如果数组仅有一个元素(无论位置如何)并且没有提供initialValue, 或者有提供initialValue但是数组为空,那么此唯一值将被返回并且callback不会被执行。
实例
- 数组求和
let arr = [20,30,40,50,60,70]
let sum = arr.reduce((prev,cur) => {
return prev+cur
},0)
//输出 270
- 求数组的最大值
let arr = [20,30,40,50,60,70]
let max = arr.reduce((prev,cur) => {
return Math.max(prev,cur);
}) //输出70
- 累加对象数组里的值,要累加对象数组中包含的值,必须提供初始值,以便各个item正确通过你的函数。
let initValue = 0;
let sum = [{x:1},{x:2},{x:3},{x:4},{x:5}].reduce((prev,cur) => {
return prev+cur.x
},initValue); //输出15
- 数组去重
let arr = [1,2,2,3,3,4,5,6,4,5]
let newArr = arr.reduce((prev,cur) => {
prev.indexOf(cur) === -1 && prev.push(cur)
return prev
},[]) //输出[1,2,3,4,5,6]
//另一种实现方式
newArr = arr.reduce((prev,cur) => {
if(!prev.includes(cur)){
prev.push(cur)
}
return prev
},[])
- 使用reduce将二维数组转换为一维数组
const arr = [[1,2],[3,4],[5,6],[7,8]];
let newArr = arr.reduce((prev,cur) => {
return prev.concat(cur);
}) //输出[1, 2, 3, 4, 5, 6, 7, 8]
- 计算数组中每个元素出现的次数
/* 如何运行?
{} 'Alice'
{Alice: 1} 'Bob'
{Alice: 1, Bob: 1} 'Tiff'
{Alice: 1, Bob: 1, Tiff: 1} 'Bruce'
{Alice: 1, Bob: 1, Tiff: 1, Bruce: 1} 'Alice'
{Alice: 2, Bob: 1, Tiff: 1, Bruce: 1}
*/
let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
let countNames = names.reduce((allNames,name) => {
console.log(allNames,name)
if(name in allNames){
allNames[name]++
}else{
allNames[name] = 1;
}
return allNames
},{})
//输出 {Alice: 2, Bob: 1, Tiff: 1, Bruce: 1}