函数中的局部变量嵌套在for循环中

时间:2018-01-28 17:17:39

标签: javascript multidimensional-array

对于一个tic tac toe游戏,我正在编写一个应该找到最佳下一步的功能。到目前为止,我传递了游戏的当前状态,然后将通过所有可能的移动进行递归。

var fieldModel = [
  ["x", "", ""],
  ["", "", ""],
  ["", "", "x"]
];

function aiMove() {
  for (var i = 0; i < fieldModel.length; i++) {
    for (var j = 0; j < fieldModel[i].length; j++) {
      if (fieldModel[i][j] === "") {
        function findBestMove(i, j) {
          var simModel = fieldModel.slice();
          simModel[i][j] = "o";
          console.log("simulation", simModel);
        }

        findBestMove(i, j);
      } 
    }
  }
}

aiMove();

问题在于,如输出所示,每个日志都会显示所有迭代运行后的数组状态。很明显simModel并不像我想要的那样本地化。

我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:3)

在多维数组上执行.slice时,只克隆根数组,但内部数组仍指向其原始引用。

例如:

[ // < This is cloned
   [1, 2, 3, 4], // <=These are not
   [1, 2, 3, 4]  // </
] 

此外,作为Jan pointed out,因为浏览器控制台将在控制台日志中突变时显示更新后的数组。如果你想避免这样做,你可以简单地console.log(JSON.stringify(simModel)),这样你就可以输出一个字符串。

如果您真的想拥有多维数组的新克隆,则需要mapslice每个元素:

&#13;
&#13;
var fieldModel = [
  ["x", "", ""],
  ["", "", ""],
  ["", "", "x"]
];

function aiMove() {
  for (var i = 0; i < fieldModel.length; i++) {
    for (var j = 0; j < fieldModel[i].length; j++) {
      if (fieldModel[i][j] === "") {
        function findBestMove(i, j) {
          var simModel = fieldModel.slice().map(function (c) {
             return c.slice();
          })
          simModel[i][j] = "o";
          console.log("simulation", simModel);
        }

        findBestMove(i, j);
      } 
    }
  }
}

aiMove();
&#13;
&#13;
&#13;