reduce是JavaScript数组中用于累积计算的核心方法,通过逐个处理元素、将前次结果传入下一次回调,最终返回单一值;其语法为arr.reduce(callback, initialValue),callback接收accumulator、currentValue等参数,initialValue可选但推荐显式指定以避免边界错误。

reduce 是 JavaScript 数组方法中用于“累积计算”的核心工具,它不直接遍历数组并做副作用操作(比如打印或修改外部变量),而是**通过逐个处理元素,把前一次的计算结果传给下一次,最终返回一个单一值**。
基本语法和执行逻辑
调用形式:arr.reduce(callback, initialValue)
- callback 接收四个参数:累计值(accumulator)、当前项(currentValue)、当前索引(index)、原数组(array);通常只用前两个
- initialValue 是可选的起始值。没传时,第一次调用 callback 会用数组第 0 项作 accumulator,第 1 项作 currentValue
- 数组为空且没提供 initialValue 时,会报错;为空但提供了 initialValue,则直接返回该值
常见归纳场景与写法
求和:[1, 2, 3, 4].reduce((sum, n) => sum + n, 0) → 10
省略初始值也可:[1, 2, 3, 4].reduce((sum, n) => sum + n)(等价,因数组非空)
找最大值:[5, 2, 9, 1].reduce((max, n) => n > max ? n : max) → 9
推荐显式传初始值避免边界问题:.reduce((max, n) => Math.max(max, n), -Infinity)
数组扁平化(一层):[[1, 2], [3], [4, 5, 6]].reduce((acc, arr) => acc.concat(arr), []) → [1, 2, 3, 4, 5, 6]
注意 accumulator 的类型和结构
reduce 不限于数字累加,accumulator 可以是对象、数组、字符串等任意类型:
立即学习“Java免费学习笔记(深入)”;
- 统计频次:
['a','b','a'].reduce((obj, c) => ({...obj, [c]: (obj[c] || 0) + 1}), {}) - 按条件分组:
items.reduce((groups, item) => { groups[item.type] = groups[item.type] || []; groups[item.type].push(item); return groups; }, {}) - 生成新数组(类似 map):
[1,2,3].reduce((arr, x) => [...arr, x * 2], [])→[2,4,6]
和 for 循环/其他方法的区别
reduce 强调“输入数组 → 输出单个值”,强调不可变和函数式风格:
- for 循环灵活但需手动维护状态变量;reduce 把状态封装在 accumulator 中,更声明式
- filter/map 是“一转一”,reduce 是“多转一”;不要强行用 reduce 替代 map 或 filter,语义不清还难读
- 链式调用中,reduce 一般放在最后,因为返回的不是数组(除非你刻意返回数组)


















