javascript - Javascript 2D 数组问题更改特定元素更改列
问题描述
当我去改变让我们说地形[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)
}
运行执行的代码时收到的输出。如您所见,列本身正在重复,我尝试在函数外部更改它们以获得相同的效果。我是 Javascript 本身的新手,我可能只是错误地定义了 2D 数组。
18 25
14 23
(20) [Array(38), Array(38), Array(38), Array(38), Array(38), Array(38), Array(38), Array(38), Array(38), Array(38), Array(38), Array(38), Array(38), Array(38), Array(38), Array(38), Array(38), Array(38), Array(38), Array(38)]
0
:
(38) [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
1
:
(38) [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
2
:
(38) [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
3
:
(38) [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
4
:
(38) [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
5
:
(38) [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
6
:
(38) [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
7
:
(38) [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
8
:
(38) [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
9
:
(38) [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
10
:
(38) [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
11
:
(38) [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
12
:
(38) [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
13
:
(38) [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
14
:
(38) [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
15
:
(38) [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
16
:
(38) [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
17
:
(38) [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
18
:
(38) [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
19
:
(38) [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
length
:
20
__proto__
:
Array(0)
解决方案
这是因为您的初始化代码将相同的con1
数组(最初是 [])分配给新数组的所有行。所以你实际上只有一行有几个引用它:
for (var i = 0; i < cols; i++){
array[i] = con1
/* ... */
}
将其更改slice
为:
for (var i = 0; i < cols; i++){
array[i] = con1.slice(); // Now it is a separate copy
/* ... */
}
推荐阅读
- javascript - 为什么我在 vue 中传递回调时没有错过上下文?
- java - 通过覆盖私有类变量作为重构之前的初始步骤来测试方法
- .net - .NET/PowerShell Core 中的 RSACryptoServiceProvider、SignData 和填充
- erlang - Erlang 读取帖子请求
- c# - C# 和 Visio 2013 - 连接两个形状的问题
- javascript - 如何避免 JavaScript 中的 JSON 指针不使用 json.stringify?
- html - CSS/Angular:扩展 div
- mysql - 加入两个表并按两列分组
- pygame - 如何在 pygame 中使用 blit 数字?
- amazon-dynamodb - DynamoDB UpdateExpression A=B+C+D 使用单个请求