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

时间:2019-01-19 17:17:49

标签: 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
    }
  }
  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)
}

运行执行的代码时收到的输出。如您所见,列本身是重复的,我尝试在函数外更改它们以获取相同的效果。我是Java语言本身的新手,我可能只是在定义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)

1 个答案:

答案 0 :(得分:1)

这是因为初始化代码将相同的import Foundation import Network class ExampleServer { var connections = [NWConnection]() lazy var listener: NWListener = { let listener = try! NWListener(using: .udp) listener.service = NWListener.Service(type: "_test._udp") listener.serviceRegistrationUpdateHandler = { (serviceChange) in switch serviceChange { case .add(let endpoint): switch endpoint { case let .service(name, _, _, _): print("listening as name \(name)") default: break } default: break } } listener.newConnectionHandler = { (newConnection) in newConnection.start(queue: DispatchQueue(label: "new client")) self.connections.append(newConnection) } return listener }() func run() { self.listener.start(queue: DispatchQueue(label: "server")) while true { for connection in self.connections { connection.receiveMessage { (message, context, isComplete, error) in connection.send(content: "world".data(using: .utf8), completion: .contentProcessed({ (error) in if let error = error { print("error while sending data: \(error)") } })) } } } } } let server = ExampleServer() server.run() RunLoop.main.run() 数组(最初是[])分配给新数组的所有行。因此,您实际上只有一行,并且其中有多个引用:

con1

使用slice将其更改为:

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