【JavaScript】Array.fill(new Array()) 创建二维数组不是想要的结果?

创建一个二维数组,思路一般是先创建一个一维数组,表示数组的行,然后再给这个一维数组的每一项放一个数组,就表示有多少列。
按照这个思路,在JS中想创建一个二维数组,先生成一个一维数组new Array(m),表示数组有m行,然后给数组每一项再填充一个n项的数组,并将所有项初始化为0,new Array(m).fill(new Array(n).fill(0)表示数组有n列,得到一个m行n列的二维数组:
在这里插入图片描述
假设我们现在想给第一项赋值为1,我们可以写arr[0][0]=1,却发现所有行的第一列都被赋值为1了:
在这里插入图片描述
这是为什么呢? 当Array.fill()的参数是一个引用类型的数据时,那么等于把这个数据的地址给了arr的每一项,相当于每一行都指向同一个数组地址,那么当你在操作任意一个位置的值时,所有行都会跟着变化,每一行的结果注定是一样的。

那么如何正确的创建二维数组呢?

1.for循环填充行

let arr = new Array(m)
for (let i = 0; i < m; i++) {
    
    
    arr[i] = new Array(n).fill(0)
}

2.Array.from()

let arr = Array.from(Array(m), () => new Array(n).fill(0))

3.数组的map方法

let arr = Array(m).fill().map(() => Array(n).fill(0))

【注意】在这里,不能删除第一个fill(),map方法是对数组中的每个值执行回调函数,数组中必须有值,不然map方法不起作用。fill()不写参数,默认填充undefined。

猜你喜欢

转载自blog.csdn.net/weixin_43790653/article/details/124574181