为什么是JSON.解析更改嵌套数组中的值

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

本文关键字:数组 嵌套 JSON 为什么      更新时间:2023-09-26

为了学习Angular 2,我用Angular CLI做了一个Connect Four游戏,当时它使用的是SystemJS。

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

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

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字符串:

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的结果,似乎随机地改变了值:

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 Pages上加载应用程序,打开浏览器上的JavaScript控制台,然后单击任何一列来移动,你可能会看得更好。

仓库在Github上:https://github.com/cmermingas/connect-four-webpack

我在这里寻找关于解析JSON嵌套数组的问题。解析,但我无法将此问题与我发现的问题联系起来。

提前感谢!

如果您将字符串示例放入小提琴中,它似乎可以很好地解析:

https://jsfiddle.net/z67Lgyrm/

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

你似乎也在列数组上使用slice(),但因为它是多维的,它只是复制对子数组的引用(即不实际复制值)。

查看这里一个可能的解决方案:创建多维数组的副本,而不是引用- JavaScript