Javascript 2D数组问题更改特定元素更改列

Javascript 2D数组问题更改特定元素更改列,javascript,arrays,Javascript,Arrays,当我改变地形[2][3]的值时,它将改变整个列,而不仅仅是特定的坐标。第一个函数创建阵列,第二个函数定义1和2的地形 var ArrayMaker = function(cols, rows, con1, con2) { var array = [] for (var i = 0; i < cols; i++){ array[i] = con1 for (var j = 0; j< rows; j++){ array[i][j] = con2

当我改变地形[2][3]的值时,它将改变整个列,而不仅仅是特定的坐标。第一个函数创建阵列,第二个函数定义1和2的地形

var ArrayMaker = function(cols, rows, con1, con2) {


var array = []
  for (var i = 0; i < cols; i++){
    array[i] = con1
    for (var j = 0; j< rows; j++){
      array[i][j] = con2
    }
  }
  return array
}

var setup = function() {
  var terrain = ArrayMaker(height/50, width/50, [], 1)

  var nLakes = Math.floor(Math.random() * 6)
  for (var i = 0; i < nLakes; i++){
    var x = Math.floor(Math.random() * (terrain.length + 1))
    var y = Math.floor(Math.random() * (terrain[1].length + 1))
    console.log(x + " " + y)
    terrain[x][y] = 2

  }
  console.log(terrain)
}

这是因为初始化代码将相同的
con1
数组(最初为[])分配给新数组的所有行。因此,实际上只有一行有多个引用:

for (var i = 0; i < cols; i++){
  array[i] = con1
  /* ... */
}

谢谢你修复了这个问题,你能解释一下splice()函数吗,我不明白它是如何工作的,并且修复了这个问题。我会尽快将您的评论标记为答案。
slice
将从给定数组中复制每个值,从而从给定数组中创建一个新数组
slice
允许指定参数仅复制数组的一部分,但如果没有参数,则复制整个数组。扩展语法也可以实现同样的效果:
array[i]=[…con1]或带有
数组[i]=array.from(con1)。选择你认为最容易的。请参考此了解切片。您还可以使用
[].concat(con1)
复制阵列
for (var i = 0; i < cols; i++){
  array[i] = con1
  /* ... */
}
for (var i = 0; i < cols; i++){
  array[i] = con1.slice(); // Now it is a separate copy
  /* ... */
}