将值从二维数组传输到另一个二维数组/ JavaScript

时间:2018-01-29 22:11:32

标签: javascript arrays

为什么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]);
    }
  }
}

1 个答案:

答案 0 :(得分:0)

TL; DR

您将单个数组传递给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);
}