reduce用于聚合而非遍历,核心是将数组逐步压缩为单个值;其语法为arr.reduce(callback, initialvalue),callback常用accumulator(上轮返回值)和currentvalue(当前项),initialvalue可选但推荐显式传入以避免空数组报错。

reduce 不是用来“遍历”的,而是用来“聚合”的——它把数组一步步压缩成一个值。想逐个处理元素,用 forEach 或 for...of 更合适;而 reduce 的核心是“累积计算”,比如求和、拼接字符串、分组、扁平化、找最大值等。
reduce 的基本结构和参数含义
语法:arr.reduce(callback, initialValue)
-
callback:接收四个参数,常用前两个:
accumulator(累积器,上一轮返回的值)和currentValue(当前项) - initialValue(可选):第一次调用 callback 时 accumulator 的初始值。不传时,accumulator 默认取数组第一个元素,currentValue 从第二个元素开始
- 如果数组为空且没给 initialValue,会报错;为空但给了 initialValue,则直接返回该值
常见聚合场景与写法
求和
[1, 2, 3, 4].reduce((sum, num) => sum + num, 0); // 10
拼接字符串(带分隔符)
['a', 'b', 'c'].reduce((str, item, i) => i === 0 ? item : str + ',' + item ); // 'a,b,c'
按属性分组(生成对象)
const users = [{id: 1, type: 'admin'}, {id: 2, type: 'user'}, {id: 3, type: 'admin'}];
users.reduce((groups, user) => {
const { type } = user;
groups[type] = groups[type] || [];
groups[type].push(user);
return groups;
}, {});
// { admin: [{id:1,type:'admin'}, {id:3,type:'admin'}], user: [{id:2,type:'user'}] }
注意容易出错的细节
- 忘记返回 accumulator:callback 中必须 显式 return 累积结果,否则下一轮 accumulator 变成
undefined - initialValue 类型要匹配预期结果:比如想得到数组,initialValue 就该是
[];想得到对象,就该是{} - 处理空数组时务必检查 initialValue 是否提供,避免运行时报错
- 箭头函数若只有一行表达式,记得加括号或换行,避免隐式返回对象字面量时被解析为代码块
替代 for 循环的典型用法(扁平化二维数组)
不用嵌套循环,一行搞定:
[[1, 2], [3, 4], [5]].reduce((flat, arr) => flat.concat(arr), []); // [1, 2, 3, 4, 5]
ES2019 后推荐用 flat(),但 reduce 仍是理解聚合逻辑的好例子。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











