为什么array2的每个值都是4(array1的最后一个值)。 我只能用2d阵列来解决这个问题。
var array1 = [
new Array(4).fill(1),
new Array(4).fill(2),
new Array(4).fill(3),
new Array(4).fill(4),
];
function test() {
var array2 = new Array(4).fill(new Array(4).fill(-1));
for (var i = 0; i < array1.length; i++) {
for (var j = 0; j < array1[0].length; j++) {
array2[i][j] = array1[i][j];
}
}
for (var i = 0; i < array1.length; i++) {
for (var j = 0; j < array1[0].length; j++) {
console.log("index: " + i + "," + j + " value: " + array2[i][j]);
}
}
}
答案 0 :(得分:0)
您将单个数组传递给fill
,并且通过引用访问数组值,因此从技术上讲,内部数组是引用到同一个数组。
第二个数组中所有值的原因是因为它首先被创建的方式:
var array2 = new Array(4).fill(new Array(4).fill(-1));
在这一行中,您要创建一个长度为4的新数组,然后“#34;填充&#34;该数组中的每个索引都带有来自此语句的输出:
new Array(4).fill(-1)
对于正在填充&#34;的每个值都不会运行该块,而是作为fill
的参数传递的值是用作每个索引的值。这对于更简单的值(如字符串和整数)工作正常,但是在JavaScript中通过引用访问对象和数组,因此每次修改一个嵌套数组的索引值时,都要修改该索引的值。所有四个嵌套数组。
所以当你做这样的事情时:
array2[0][0] = 3
array2
将以此值结束:
[ [ 3, -1, -1, -1],
[ 3, -1, -1, -1],
[ 3, -1, -1, -1],
[ 3, -1, -1, -1] ]
为了更改它以便不通过引用来完成,您可以使用spread运算符并以这种方式构建数组。
var array2 = [...Array(4)].map(_ => [...Array(4)])
如果您不在可以使用扩展运算符的环境中工作,您还可以遍历这些值,这些值将执行每个的new Array
语句值:
var array2 = new Array(4);
for (var i=0; i<array2.length; i++) {
array2[i] = new Array(4).fill(-1);
}