map生成新数组,forEach执行副作用不返回值;reduce用于将数组聚合为单一结果,如求和、转对象、分组或扁平化。

map 生成一个新数组,每个元素是原数组元素调用回调函数后的返回值;forEach 只遍历执行回调,不返回有意义的值(返回 undefined),也不生成新数组。
map 和 forEach 的核心区别
两者都遍历数组,但目的和行为不同:
- map 关注“转换”:必须有返回值,且自动收集所有返回值组成新数组。原数组不变。
- forEach 关注“执行副作用”:比如修改外部变量、发起请求、操作 DOM。它不关心返回什么,也不提供链式调用基础。
- 误用
forEach想实现映射逻辑(如arr.forEach(x => x * 2))不会得到新数组,结果丢失。
什么时候该用 reduce?
当你需要把数组“收拢”成一个单一结果时,reduce 是最直接的选择。它适合聚合、分组、扁平化、构建对象或特殊结构等场景。
- 求和、求积、找最大/最小值(比
Math.max(...arr)更可控) - 将数组转为对象(如:
arr.reduce((obj, item) => ({ ...obj, [item.id]: item }), {})) - 按条件分组:
arr.reduce((groups, item) => { groups[item.type] = groups[item.type] || []; groups[item.type].push(item); return groups; }, {}) - 扁平化嵌套数组:
arr.reduce((flat, sub) => flat.concat(sub), [])
简单判断原则
想得到一个新数组 → 用 map(映射)、filter(筛选)、flatMap(映射+扁平);
只想做点事(无返回需求)→ 用 forEach;
想把数组“压成一个东西” → 优先考虑 reduce。
立即学习“Java免费学习笔记(深入)”;











