let arr = Array(3).fill(Array(3).fill(0))
arr[1][2] = 1
console.log(arr)
/* =>
[0, 0, 1]
[0, 0, 1]
[0, 0, 1]
*/
如果这个方法行不通,还有什么方法能优雅地初始化一个n*n二维数组呢,并不想用两层的for循环……
let arr = Array(3).fill(Array(3).fill(0))
arr[1][2] = 1
console.log(arr)
/* =>
[0, 0, 1]
[0, 0, 1]
[0, 0, 1]
*/
如果这个方法行不通,还有什么方法能优雅地初始化一个n*n二维数组呢,并不想用两层的for循环……
function create_2d_array(n, m, v) {
return new Array(n).fill(undefined).map(() => new Array(m).fill(v))
}
先用 Array()
生成一维数组,然后通过 map()
每次迭代返回新数组的引用(而非同一个数组的引用),再通过 fill()
填充初始值。(直接 new Array()
返回的数组需要 fill()
填充值,如undefined
,才能使用 map
)
fill()每次都是创建一个对象,指的是同一内存地址的对象,简单来说就是浅拷贝,所以会同时变更数据。
Array(3).fill(0); //输出[0, 0, 0];
Array(3).fill(Array(3).fill(0));//拷贝三次[0, 0, 0],也就是相当于一个二维数组[[0, 0, 0],[0, 0, 0],[0, 0, 0]]
arr[1][2] = 1; //更改第二行第三列的数据,所以就变成了
/* =>
[0, 0, 1]
[0, 0, 1]
[0, 0, 1]
*/
解决办法:
其他人的回答,或者:
var arr = new Array(3).fill(JSON.stringify({
name: 'deng',
age: 18,
job: 'software'
}))
arr=arr.map(item=>JSON.parse(item))
console.log(arr)
arr[0].name = 'dengbbbb'
console.log(arr)
8 回答4.4k 阅读✓ 已解决
6 回答2.8k 阅读✓ 已解决
5 回答2.5k 阅读✓ 已解决
5 回答6.1k 阅读✓ 已解决
4 回答2.1k 阅读✓ 已解决
3 回答2.3k 阅读
4 回答2.7k 阅读✓ 已解决
供参考
或者