reduce实现js
reduce 方法的基本概念
reduce 是 JavaScript 数组的高阶函数,用于将数组元素通过回调函数累加为单个值。其语法为:
array.reduce(callback(accumulator, currentValue, index, array), initialValue)
accumulator:累加器,存储回调函数的返回值。currentValue:当前处理的数组元素。index(可选):当前元素的索引。array(可选):调用reduce的数组。initialValue(可选):累加器的初始值。若省略,默认使用数组的第一个元素作为初始值。
常见应用场景
求和

const numbers = [1, 2, 3, 4];
const sum = numbers.reduce((acc, curr) => acc + curr, 0);
console.log(sum); // 输出: 10
扁平化数组
const nestedArray = [[1, 2], [3, 4], [5, 6]];
const flatArray = nestedArray.reduce((acc, curr) => acc.concat(curr), []);
console.log(flatArray); // 输出: [1, 2, 3, 4, 5, 6]
统计字符出现次数

const words = ['hello', 'world', 'hello'];
const wordCount = words.reduce((acc, curr) => {
acc[curr] = (acc[curr] || 0) + 1;
return acc;
}, {});
console.log(wordCount); // 输出: { hello: 2, world: 1 }
注意事项
- 若数组为空且未提供
initialValue,会抛出TypeError。 - 提供
initialValue可避免意外行为,例如处理对象数组时建议显式初始化。
进阶用法
链式调用
结合 map 和 filter:
const data = [1, 2, 3, 4];
const result = data
.map(x => x * 2)
.filter(x => x > 4)
.reduce((acc, curr) => acc + curr, 0);
console.log(result); // 输出: 14 (6 + 8)
按属性分组
const people = [
{ name: 'Alice', age: 21 },
{ name: 'Bob', age: 21 },
{ name: 'Charlie', age: 22 }
];
const groupedByAge = people.reduce((acc, curr) => {
const age = curr.age;
if (!acc[age]) acc[age] = [];
acc[age].push(curr);
return acc;
}, {});
console.log(groupedByAge);
// 输出: { 21: [{...}, {...}], 22: [{...}] }
通过灵活使用 reduce,可以高效处理数组的聚合、转换和分组操作。






