1. 问题描述
在做leetcode题目的时候,我一开始用下面一段代码创建二维数组:
let arr = new Array(m).fill(new Array(n).fill(0))
打印出的结果是没有问题的,但是我需要对元素进行赋值操作,发现有些测试用例过不了,打印最后生成的arr发现很多元素自增了多次。
2. 原因分析
上面方法创建的是一个包含 n 个元素的数组的引用,这个数组的每个元素都被填充为 0。当 fill 方法将这个数组填充到外部数组中时,它只是将这个数组的引用复制到了每个位置上。这意味着,当我们更改一个元素时,这个变化会反映在所有行上,因为它们都共享同一个内部数组的引用。
3. 解决
- 使用如下方式创建二维数组:
let arr = new Array(m).fill(0).map(() => new Array(n).fill(0))
这种方法使用了两个操作符:fill 和 map。首先,new Array(m) 创建一个包含 m 个元素的新数组,每个元素都是 undefined。然后使用 fill(0) 将每个元素都填充为 0。接着,使用 map(() => new Array(n).fill(0)) 将数组的每个元素都映射为一个包含 n 个元素的新数组,每个元素都是 0。这样,我们就得到了一个 m 行 n 列的二维数组。