You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何使用reduce()合并数组时意外修改了原数组bigArray2的第一个元素?

为何使用reduce()合并数组时意外修改了原数组bigArray2的第一个元素?

嘿,这个坑我刚学reduce的时候也踩过!问题出在你没给reduce传入初始的累加器值,这直接导致了原数组被意外修改。

我给你拆解一下发生了什么:

  • 当你调用reduce()但不传第二个参数(初始累加器)时,JS会自动把数组的第一个元素作为初始的accumulated值,而且这是引用传递——也就是说accumulated和bigArray2[0]指向的是同一个数组,不是复制出来的新数组!
  • 然后你的回调函数里一直在执行accumulated.push(element),这操作本质上就是在给bigArray2[0]添加元素。等reduce遍历完所有元素,bigArray2[0]自然就变成了所有元素合并后的数组,而你得到的combinedArray其实就是bigArray2[0]的引用,两者完全是同一个东西。
  • 这就是为什么你打印bigArray2时,第一个元素变成了合并后的数组——它从一开始就被当成了累加器,全程被修改了。

修复方法超级简单,给reduce加一个初始的空数组作为第二个参数就行:

const combinedArray = bigArray2.reduce((accumulated, current) => {
  for (element of current) {
    accumulated.push(element);
  }
  return accumulated;
}, []); // 新增的初始空数组

这样accumulated一开始就是一个全新的空数组,和原数组没有任何引用关联,所有push操作都只会修改这个新数组,原数组bigArray2就能保持原样了。

顺便提一句,要是只是想合并二维数组,其实用flat()更简洁:const combinedArray = bigArray2.flat();,一行代码搞定~

备注:内容来源于stack exchange,提问作者Jake

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.14 18:18:07