我正在为学校项目开发Connect Four应用程序。 目前,我正在尝试JSON.stringify一个包含二维“洞”对象数组的对象(每个对象包含键:x,y,列,行,p1和p2),以便我可以将它发送到服务器,并让它向两个客户广播 - >这将使两个客户的游戏状态保持更新。
在我JSON.stringify(holeObjArray)之前,我控制台。记录了对象的内容,它们显示了更新的游戏状态:
我突出显示(红色):holeObjArray [5] [6]包含一个键'p1'= 1,这对应于当前游戏状态(右侧)。
当我JSON.stringify对象时,在这里看到:
function sendGrid()
{
console.log(holeObjArray);
JSONStr = JSON.stringify(holeObjArray);
console.log(JSONStr);
//ws.send(JSONStr);
}
JSONStr的输出显示以下内容:
如您所见,字符串化对象不代表当前游戏状态。实际上,如果我继续播放,则字符串化对象将始终代表 last 播放中的电路板状态。 我不明白为什么JSON.stringify()这样做? 特别是因为holeObjArray在我对其进行字符串化之前正确地表示了网格,但是一旦我这样做,JSONStr字符串就代表了刚刚制作的网格。 任何有关此问题的帮助将不胜感激,
谢谢,
Alex
答案 0 :(得分:1)
在控制台中,展开对象时,它会在您展开对象属性时显示对象属性的值,而不是在将对象属性记录到控制台时。因此,记录对象的JSON.stringify方式是在记录对象时显示当前值的正确方法。
答案 1 :(得分:0)
好的,我为此没有完成而道歉。但我想我至少知道你可以从哪里开始。
我确定你知道,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对象进行字符串化。
如果有帮助,请告诉我!