在多维对象数组中设置属性值

时间:2017-07-11 10:25:53

标签: javascript object multidimensional-array

我正在尝试初始化多个数组 sudoku [9] [9] ,它由 cell 组成 当我在* sudoku [x]中运行 sudoku.initialize(),所有 col 时y] * s各为8,8,9。

 sudoku[2][2].box=1
    1
    sudoku[4][8].box=2
    2
    sudoku[2][2].box
    2
    sudoku[3][3].box
    2

我猜在javascript中存在对多维数组的误解。

foreground

因为我是javascript的初学者,这个代码可能很荒谬。但无论如何你可以抓住我的意思。

2 个答案:

答案 0 :(得分:1)

多维数组中的所有81个项目都指向同一个对象,因为:

for (var i = 0; i < 9; i++) {
    for (var j = 0; j < 9; j++) {
        sudoku[i][j] = cell;
    }
}

sudoku[i][j]存储对同一对象cell的引用 当您稍后尝试修改/访问sudoku[2][2]sudoku[3][3]sudoku[4][8]中的值时,您实际上使用的是同一个对象。

您需要为每个单元格创建一个新对象 以这种方式更改代码应该有所帮助:

for (var i = 0; i < 9; i++) {
    for (var j = 0; j < 9; j++) {
        sudoku[i][j] = {
            sol: 0,
            row: 0,
            col: 0,
            box: 0,
            candi: [1, 2, 3, 4, 5, 6, 7, 8, 9]
        };
    }
}

您的if方法中也不需要这么多initialize 一些数学和整数除法/模数将在两行代码中完成所有魔术;)

function Cell(row, col)
{
  this.col = col;
  this.row = row;
  this.sol = 0;
  this.box = Math.ceil(row / 3) * 3 + Math.ceil(col / 3) - 3;
  this.candidates = [1, 2, 3, 4, 5, 6, 7, 8, 9];
}

function Sudoku()
{
  this.rows = new Array(9);
  for (var i = 0; i < 9; i++) 
  {
    this.rows[i] = new Array(9);
    for (var j = 0; j < 9; j++) {
      this.rows[i][j] = new Cell(i, j);
    }
  }
  
  this.print = function() {
    for (var i = 0; i < 9; i++) {
        for (var j = 0; j < 9; j++) {
            document.write(this.rows[i][j].row + "/" + this.rows[i][j].col + "&nbsp");
        }
        document.write("<br/>");
    }
  };
}

var sudoku = new Sudoku();
sudoku.print();

答案 1 :(得分:0)

问题是您要为每个单元格分配相同的对象。因为Javascript中的对象是通过引用(而不是值)存储的,所以执行

data.replace({'very bad': 1, 'bad': 2, 'poor': 3, 'good': 4, 'very good': 5}, inplace=True)

基本上使sudoku[1][2] = cell; sudoku[1][2]意味着相同的事情。您需要为cell中的每个位置创建一个新的单元格对象。关于如何在Javascript中定义“类”并实例化对象,有很多可用的材料,例如参见:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/new

虽然还有其他可能的方法,例如你可以克隆对象,使用原型等等。