reduce是javascript数组归约方法,通过累加器将数组转为单值,语法为arr.reduce(callback, initialvalue),需注意初始值、返回值及箭头函数对象返回括号问题。

reduce 是 JavaScript 数组的内置方法,用于将数组“归约”为单个值——比如求和、找最大值、扁平化、对象分组等。它通过一个“累加器(accumulator)”逐个处理元素,每次返回新状态,最终输出唯一结果。
基本语法和参数含义
调用形式:arr.reduce(callback, initialValue)
-
callback:执行归约的函数,接收四个参数:
– accumulator(上一次回调返回的值,或初始值)
– currentValue(当前遍历的元素)
– currentIndex(可选,当前索引)
– array(可选,原数组) - initialValue(可选):累加器的起始值。不传时,第一次调用以 arr[0] 为 accumulator,从 arr[1] 开始遍历;若数组为空且无初始值,会报错。
常见实用场景与写法
求和
[1, 2, 3, 4].reduce((sum, num) => sum + num, 0) → 10
找最大值
[5, 2, 9, 1].reduce((max, cur) => cur > max ? cur : max) → 9(不传初始值,自动取首项)
数组扁平化(一层)
[[1, 2], [3], [4, 5, 6]].reduce((acc, arr) => acc.concat(arr), []) → [1, 2, 3, 4, 5, 6]
按属性统计分组(转为对象)
[{name: 'Alice', type: 'user'}, {name: 'Bob', type: 'admin'}].reduce((obj, item) => {
obj[item.type] = obj[item.type] || [];
obj[item.type].push(item);
return obj;
}, {}) → { user: [...], admin: [...] }
注意事项和易错点
- 务必注意 是否传了 initial value:空数组调用 reduce 且没给初始值会抛错;需要返回对象/数组时,几乎总要显式传空对象 {} 或空数组 []。
- callback 必须有 返回值,否则下一轮 accumulator 变成 undefined,容易引发意外结果(如 NaN 或字符串拼接)。
- 箭头函数若只有一条语句且需返回对象,记得加括号:
.reduce((acc, x) => ({ ...acc, [x]: true })) —— 不加括号会被解析为代码块,不返回。
替代方案对比(什么情况下别硬用 reduce)
不是所有聚合操作都适合 reduce:
- 简单求和/乘积/最值 → reduce 合适;但已有更语义化的 API 时也可考虑:
Math.max(...arr) 比 reduce 更简洁(小数组);
arr.some()/arr.every() 比用 reduce 手动实现布尔聚合更清晰。 - 需要中途退出(如找到首个满足条件的元素)→ find 或 findIndex 更直接,reduce 无法自然 break。











