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

JS中向嵌套数组添加元素异常:所有子数组均被修改

问题原因与解决方案

问题根源

你遇到的问题核心是**Array.fill()方法的特性**:当你用new Array(data[0].length).fill([])创建数组时,fill会把传入的[]这个单个数组引用复制到数组的每一个位置。也就是说,columns里的所有子数组其实指向的是同一个内存地址的数组,不管你对哪个columns[i]执行push操作,本质上都是在修改同一个数组,所以所有子数组都会同步变化。

修复方案

要创建每个元素都是独立空数组的数组,需要确保每个子数组都是新创建的,而不是复用同一个引用。推荐两种方法:

方法1:使用Array.from()

let columns = Array.from({ length: data[0].length }, () => []);

Array.from的第二个参数是映射函数,每次迭代都会执行() => [],返回一个全新的空数组,这样每个子数组都是独立的。

方法2:使用Array.map()(需先初始化数组元素)

let columns = new Array(data[0].length).fill(null).map(() => []);

注意:直接用new Array(n).map(...)会跳过空位,所以需要先用fill(null)填充占位符,再通过map生成新的空数组。

修复后的代码示例

let columns = Array.from({ length: data[0].length }, () => []);

data[0].split('').forEach((el, i) => {
    if (i < 5) {
        console.log('el: ', el, 'i: ', i);
        columns[i].push(el);
    }
});

console.log(columns);

此时执行代码,就会只有前5个子数组包含元素,其余保持为空,符合预期。

内容的提问来源于stack exchange,提问作者Paweł Czekaj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 13:55:14