【问题标题】:setting property values in Multi-dimensional object array在多维对象数组中设置属性值
【发布时间】:2017-07-11 10:25:52
【问题描述】:

我正在尝试初始化由 cell 组成的多数组 sudoku[9][9] 当我运行 sudoku.initialize(), all row, col, box in *sudoku[x][ y]*s 分别为 8,8,9。

  var cell = {
    sol: 0,
    row: 0,
    col: 0,
    box: 0,
    candi: [1, 2, 3, 4, 5, 6, 7, 8, 9]
};


var sudoku = {}
sudoku = new Array(9);
for (var i = 0; i < 9; i++) {
    sudoku[i] = new Array(9);
}
for (var i = 0; i < 9; i++) {
    for (var j = 0; j < 9; j++) {
        sudoku[i][j] = cell;
    }
}
sudoku.initialize = function () {
    for (var i = 0; i < 9; i++) {
        for (var j = 0; j < 9; j++) {
            sudoku[i][j].row = i;
            sudoku[i][j].col = j;
            if (i < 3) {
                if (j < 3)
                    sudoku[i][j].box = 1;
                else if (2 < j && j < 6)
                    sudoku[i][j].box = 2;
                else if (5 < j)
                    sudoku[i][j].box = 3;
            }
            else if (2 < i && i < 6) {
                if (j < 3)
                    sudoku[i][j].box = 4;
                else if (2 < j && j < 6)
                    sudoku[i][j].box = 5;
                else if (5 < j)
                    sudoku[i][j].box = 6;
            }
            else if (5 < i)
                if (j < 3)
                    sudoku[i][j].box = 7;
                else if (2 < j && j < 6)
                    sudoku[i][j].box = 8;
                else if (5 < j)
                    sudoku[i][j].box = 9;
        }
    }
}
sudoku.print=function(){
    for (var i = 0; i < 9; i++) {
        for (var j = 0; j < 9; j++) {
            document.write(sudoku[i][j].col + "&nbsp");
        }
        document.write("\n");
    }
}
sudoku.initialize();`

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

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

因为我是 javascript 的初学者,这些代码可能很荒谬。但无论如何你都能明白我的意思。

【问题讨论】:

  • 数组中的所有 81 个项目都指向同一个对象。

标签: javascript object multidimensional-array


【解决方案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]
        };
    }
}

您的initialize 方法中也不需要那么多ifs。
一些数学和整数除法/模数可以在两行代码中完成所有的魔法;)

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();

【讨论】:

    【解决方案2】:

    问题是您将相同的对象分配给每个单元格。因为 Javascript 中的对象是按引用(而不是按值)存储的,所以这样做

    sudoku[1][2] = cell;
    

    基本上使sudoku[1][2]cell 表示相同的意思。您需要为sudoku 中的每个位置创建一个新的单元格对象。有很多关于如何在 Javascript 中定义“类”和实例化对象的材料,例如:

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

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

    【讨论】:

      猜你喜欢
      • 2017-12-15
      • 2020-08-01
      • 2013-06-11
      • 2023-03-19
      • 2016-10-27
      • 2013-10-03
      • 2017-08-23
      • 1970-01-01
      • 2021-12-06
      相关资源
      最近更新 更多