用 reduce 扁平化二维数组的核心是每次迭代将子数组合并到空数组累加器中:基础写法用 acc.concat(curr),现代写法用 [...acc, ...curr];二者均不修改原数组,但多次创建新数组有性能开销;仅扁平化一层,若含非数组项需先判断是否为数组再处理。

用 reduce 遍历二维数组并扁平化为一维数组,核心是把每次迭代的子数组用 concat(或展开运算符)合并到累加器中。
基础写法:用 concat 合并
累加器初始值设为空数组 [],每轮把当前子数组拼接到累加器上:
const arr2D = [[1, 2], [3, 4], [5]]; const flat = arr2D.reduce((acc, curr) => acc.concat(curr), []); // 结果:[1, 2, 3, 4, 5]
现代写法:用展开运算符(更简洁)
用 [...acc, ...curr] 替代 concat,语义更直观:
const flat = arr2D.reduce((acc, curr) => [...acc, ...curr], []); // 结果相同:[1, 2, 3, 4, 5]
注意点:避免修改原数组 & 性能考虑
-
concat和展开运算符都返回新数组,不会修改acc或curr - 对大数组,多次创建新数组可能有性能开销;如需极致性能,可改用
forEach+push.apply,但reduce写法更函数式、易读 - 如果二维数组里有空项(如
[1,2], [], [3]),不影响结果,空数组展开后不贡献元素
扩展:只扁平化一层(非递归)
上面所有写法都只处理“二维”,即每个元素必须是数组。若原数组混有非数组项(如 [1, [2,3], 4]),需先过滤或判断:
立即学习“Java免费学习笔记(深入)”;
const mixed = [1, [2, 3], 4, [5]]; const flatSafe = mixed.reduce((acc, curr) => Array.isArray(curr) ? [...acc, ...curr] : [...acc, curr], [] ); // 结果:[1, 2, 3, 4, 5]


















