关于javascript:为什么JSON.parse会更改嵌套数组中的值?

Why is JSON.parse changing the values in nested arrays?

为了学习Angular2,我在使用SystemJS时用AngularCLI制作了一个ConnectFour游戏。

我正在用新的基于Webpack的CLI从头复制这项工作,我遇到了一个奇怪的问题…

下面的方法接收一个包含JSON编码数据的字符串,并用它初始化一个新的游戏实例。我添加了一些console.log来显示问题:

1
2
3
4
5
6
7
8
9
10
11
export class ConnectFourGameModel {
  static fromJSON(jsonString: any): ConnectFourGameModel {
    let jsonData = JSON.parse(jsonString);

    console.log('*** from JSON (compare the"columns" array between jsonString and jsonData below) ***');
    console.log('jsonString: ', jsonString);
    console.log('jsonData: ', jsonData);

    ...
    return result;
}

运行时,第一个console.log正确显示json字符串:

1
2
3
4
jsonString:
{... Several fields here ...
"columns":[[0,0,0,0,0,1],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0],[0,0,0,0,0,0]]
}

但是第二个console.log,这只是在这个字符串上调用JSON.parse的结果,似乎是随机改变值:

1
2
3
4
5
6
7
8
jsonData:
> Object {... Several fields here ...
  > columns: Array[15]
    V 0: Array[6]
        0: 2     <-- Should be 0
        1: 2     <-- Should be 0
        2: -1    <-- Should be 0
        etc...

为什么会这样?

如果您在Github页面上加载应用程序,在浏览器上打开JavaScript控制台,然后单击任何列进行移动,您可能会看到更好的效果。

存储库位于github上:https://github.com/cmermingas/connect-four-webpack

我在这里寻找有关用json.parse解析嵌套数组的问题,但是我不能将这个问题与我发现的问题联系起来。

提前多谢!


如果你把你的字符串例子放进一把小提琴里,它看起来解析得很好:

https://jsfiddle.net/z67lgyrm/

可能发生的情况是,您在console.log()调用后正在更改数据。当您单击日志中的展开箭头时,它实际上正在显示对象的值。

另外,您似乎在列数组上使用了slice(),但由于它是多维的,所以它只复制了对子数组的引用(即不实际复制值)。

请参阅此处以获取可能的解决方案:创建多维数组的副本,而不是引用-javascript