map生成新数组,forEach执行副作用不返回值;reduce用于将数组聚合为单一结果,如求和、转对象、分组或扁平化。
map 生成一个新数组,每个元素是原数组元素调用回调函数后的返回值;forEach 只遍历执行回调,不返回有意义的值(返回 undefined),也不生成新数组。
两
者都遍历数组,但目的和行为不同:
forEach 想实现映射逻辑(如 arr.forEach(x => x * 2))不会得到新数组,结果丢失。当你需要把数组“收拢”成一个单一结果时,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。