js reduce累加器
reduce() 是 JavaScript 数组的一个高阶函数,用于将数组元素通过一个 reducer 函数累积计算为单个值。
基本语法
array.reduce(callback(accumulator, currentValue[, index[, array]])[, initialValue])
参数说明
callback - 执行数组中每个值的函数,包含四个参数:
accumulator (acc) - 累积器,累积回调的返回值
currentValue (cur) - 数组中正在处理的当前元素
currentIndex (idx) - 可选,数组中正在处理的当前元素的索引
sourceArray (src) - 可选,调用 reduce() 的数组
initialValue - 可选,作为第一次调用 callback 函数时的第一个参数的值。如果没有提供初始值,则将使用数组中的第一个元素。
工作原理
-
如果没有提供 initialValue,reduce 会从索引 1 开始执行 callback 方法,跳过第一个索引。如果提供 initialValue,从索引 0 开始。
-
如果数组为空且没有提供 initialValue,会抛出 TypeError。
-
如果数组仅有一个元素且没有提供 initialValue,或者提供了 initialValue 但数组为空,则直接返回该唯一值或 initialValue,不会执行 callback。
实例:
- 数组求和
const numbers = [1, 2, 3, 4];
const sum = numbers.reduce((acc, cur) => acc + cur, 0);
console.log(sum); // 10
- 数组求积
const numbers = [1, 2, 3, 4];
const product = numbers.reduce((acc, cur) => acc * cur, 1);
console.log(product); // 24
- 扁平化二维数组
const flattened = [[0, 1], [2, 3], [4, 5]].reduce((acc, cur) => acc.concat(cur),[]
);
console.log(flattened); // [0, 1, 2, 3, 4, 5]
- 统计字符出现次数
const letters = ['a', 'b', 'a', 'c', 'b', 'a'];
const count = letters.reduce((acc, cur) => {acc[cur] = (acc[cur] || 0) + 1;return acc;
}, {});
console.log(count); // { a: 3, b: 2, c: 1 }
- 按属性对对象分类
const people = [{ name: 'Alice', age: 21 },{ name: 'Bob', age: 20 },{ name: 'Charlie', age: 21 }
];const groupedByAge = people.reduce((acc, person) => {const age = person.age;if (!acc[age]) {acc[age] = [];}acc[age].push(person);return acc;
}, {});console.log(groupedByAge);
/*
{20: [{ name: 'Bob', age: 20 }],21: [{ name: 'Alice', age: 21 },{ name: 'Charlie', age: 21 }]
}
*/
注意事项
总是提供初始值 initialValue 是一个好习惯,可以避免空数组导致的错误
reduce() 不会改变原数组
对于大型数组,考虑性能问题,因为 reduce() 需要遍历整个数组
reduce() 是一个非常强大的数组方法,可以用于各种累积和转换操作,熟练掌握它能大大简化许多数据处理任务。