JSON.stringify 不代表被字符串化的对象

JSON.stringify does not represent Object which was Stringified

我正在为一个学校项目开发 Connect Four 应用程序。 目前,我正在尝试 JSON.stringify 一个包含 "hole" 个对象的二维数组的对象(每个对象包含键:x、y、列、行、p1 和 p2),以便我可以发送它到服务器,并让它向两个客户端广播 -> 这将为两个客户端更新游戏状态。

就在我 JSON.stringify(holeObjArray) 之前,我 console.logged 对象的内容,它们显示更新的游戏状态:

object before stringify

我已经突出显示(红色):holeObjArray[5][6] 包含一个键 'p1' = 1,这对应于当前游戏状态(在右侧)。

当我JSON.stringify对象时,看到这里:

function sendGrid()
{
  console.log(holeObjArray);
  JSONStr = JSON.stringify(holeObjArray);
  console.log(JSONStr);
  //ws.send(JSONStr);
}

JSONStr 的输出显示如下:

object after stringify

如您所见,字符串化对象并不代表当前游戏状态。事实上,如果我继续玩,字符串化对象将始终代表 last 游戏的棋盘状态。 我不明白为什么 JSON.stringify() 这样做? 特别是因为 holeObjArray 在我对它进行字符串化之前正确地表示了网格,但是一旦我这样做了,JSONStr 字符串就表示在刚刚创建的网格之前移动的网格。 非常感谢对此问题的任何帮助,

谢谢,

亚历克斯

好的,我很抱歉这不完整。但我想我至少知道你可以从哪里开始。

我相信您知道,Javascript 有一种有趣的处理范围的方式,因此有时会产生看似不可预测的状态。我的直觉是,在这种情况下,JSON.stringify() 方法正在 hoisted,因此比您希望的更快地将字符串分配给 JSONStr 变量。

试试这样的方法:

const sendGrid = function(wholeObjArray) {
  console.log(holeObjArray);
  let JSONStr = JSON.stringify(wholeObjArray);
  return JSONStr;
}
// where gamestate === wholeObjArray
console.log(sendGrid(gameState));
ws.send(sendGrid(gameState));

这应该确保您不会将 JSON 对象字符串化,直到您真正想要这样做。

如果有帮助请告诉我!

在控制台中,当您展开一个对象时,它会显示您展开时对象属性的值,而不是您将其登录到控制台时的值。因此,JSON.stringify 记录对象的方式是在您记录对象时显示当前值的正确方式。