reduce是JavaScript数组方法,通过累加器逐步处理元素返回单一值;需注意初始值设置,否则空数组会报错,单元素数组不执行回调;广泛用于求和、去重、统计等场景。

reduce 是 JavaScript 数组的一个方法,用来把数组“压缩”成一个单一的值——比如求和、找最大值、拼接字符串,甚至转成对象。它通过一个“累加器”(accumulator)记住上一步的结果,再一步步处理每个元素,最终返回累积完成的值。
累加器怎么工作的?
每次调用传入的回调函数时,第一个参数就是累加器,它保存着截至目前的计算结果;第二个参数是当前正在处理的数组元素。回调函数返回什么,下一轮的累加器就变成什么。
例如:[1, 2, 3, 4].reduce((sum, item) => sum + item, 0)
- 初始值是 0(作为第一次的 sum)
- 第一轮:sum = 0,item = 1 → 返回 1
- 第二轮:sum = 1,item = 2 → 返回 3
- 第三轮:sum = 3,item = 3 → 返回 6
- 第四轮:sum = 6,item = 4 → 返回 10
- 最终结果就是 10
初始值(initialValue)很重要
如果不传初始值,reduce 会把数组第一个元素当作累加器的起始值,从第二个元素开始遍历。
立即学习“Java免费学习笔记(深入)”;
- 空数组调用 reduce 且没给初始值 → 报错
- 数组只有一个元素且没给初始值 → 直接返回那个元素,回调函数根本不执行
- 想确保逻辑稳定,尤其是处理可能为空的数组时,建议显式传入初始值
不只是加数字:常见实用场景
reduce 的灵活性在于回调函数怎么写:
- 求最大值:[3, 7, 2].reduce((max, item) => item > max ? item : max, -Infinity)
- 数组去重:[1, 2, 2, 3].reduce((uniq, item) => uniq.includes(item) ? uniq : [...uniq, item], [])
- 统计频次:['a', 'b', 'a'].reduce((count, char) => ({ ...count, [char]: (count[char] || 0) + 1 }), {})
- 扁平化二维数组:[[1,2], [3,4]].reduce((flat, arr) => flat.concat(arr), [])
基本上就这些。它不复杂,但容易忽略初始值和累加器的传递逻辑。多练几次,自然就顺了。











