JSON.stringify не представляет объект, который был преобразован в строку

Я работаю над приложением Connect Four для школьного проекта. В настоящее время я пытаюсь JSON.stringify объект, содержащий двумерный массив объектов «дыры» (каждый из которых содержит ключи: x, y, столбец, строку, p1 и p2), чтобы я мог отправить его на сервер, и пусть он транслирует его двум клиентам -> Это будет обновлять состояние игры для обоих клиентов.

Прямо перед тем, как я JSON.stringify(holeObjArray), я console.log зарегистрировал содержимое объекта, и они показывают обновленное состояние игры:

объект перед строкой

Я выделил (красным):holeObjArray[5][6] содержит ключ 'p1' = 1, и это соответствует текущему состоянию игры (справа).

Когда я JSON.stringify объект, видно здесь:

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

Вывод JSONStr показывает следующее:

объект после строки

Как видите, строковый объект не представляет текущее состояние игры. На самом деле, если я продолжу играть, строковый объект всегда будет представлять состояние доски при последней игре. Я не понимаю, почему JSON.stringify() делает это? Особенно потому, что HoleObjArray правильно представляет сетку до того, как я ее упорядочу, но как только я это сделаю, строка JSONStr представляет сетку в движении до той, которая была только что создана. Любая помощь в этом вопросе будет принята с благодарностью,

Спасибо,

Алекс


person pSash    schedule 24.10.2017    source источник
comment
консоль лежит - значения, которые вы видите в консоли, могут измениться - тогда как JSON.stringify - это настоящий неизменяемый снимок строки   -  person Jaromanda X    schedule 24.10.2017
comment
Хорошо... но по мере того, как я продолжаю играть в игру, и клиенты JSON.parse передают JSONString (состояние игры), каждому клиенту отображается состояние игры, которое отстает на один ход. Итак, JSONString устарела (на один ход)...   -  person pSash    schedule 24.10.2017
comment
хорошо, вы не вызываете этот код после того, как ход сделан? Трудно понять, в чем проблема без кода....   -  person epascarello    schedule 24.10.2017
comment
вам нужно будет показать больше кода, чем вы показали   -  person Jaromanda X    schedule 24.10.2017
comment
Я отредактировал вопрос и добавил код клиента. Спасибо, Яроманда Х.   -  person pSash    schedule 24.10.2017
comment
Как говорит @JaromandaX, console.log часто лжет. Вставьте оператор debugger; сразу после console.log и посмотрите, отличается ли зарегистрированное значение от значения без него.   -  person Amadan    schedule 24.10.2017


Ответы (2)


В консоли, когда вы расширяете объект, он показывает значения свойств объекта в тот момент, когда вы его расширяете, а не когда вы регистрируете его в консоли. Таким образом, способ ведения журнала объекта JSON.stringify является правильным способом отображения текущих значений на момент его регистрации.

person Greg Hornby    schedule 24.10.2017

Хорошо, я извиняюсь за то, что это не было полным. Но я думаю, что по крайней мере знаю, с чего можно начать.

Я уверен, вы знаете, что в Javascript есть забавный способ управления областью видимости, и поэтому иногда он может генерировать кажущееся непредсказуемым состояние. Я предполагаю, что в этом случае метод JSON.stringify() поднят и поэтому присваивает строку вашей переменной 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 в строку, пока вы действительно этого не захотите.

Дайте мне знать, если это поможет!

person Luke Vance    schedule 24.10.2017
comment
предполагается, что «wholeObjArray» и «holeObjArray» разные? - person pSash; 24.10.2017
comment
лол, мой плохой, я думаю, что мой мозг просто прочитал это в вашем примере - person Luke Vance; 24.10.2017