2016-08-17 95 views
0

爲了學習Angular 2,我在使用SystemJS時使用Angular CLI做了Connect Four game爲什麼JSON.parse更改嵌套數組中的值?

我複製的努力從頭開始用新的基於的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... 

這是爲什麼HAPP效果圖創作?

如果您使用load the app on Github Pages,您可以更好地看到它,在瀏覽器上打開JavaScript控制檯,然後單擊任何列進行移動。

庫是在Github上:https://github.com/cmermingas/connect-four-webpack

我看了這裏的問題就解析嵌套的數組與JSON.parse但我不能涉及這個問題我發現的。

非常感謝!

+0

你改變數據。通過'console.log'顯示的對象是* live *,因此即使在記錄之後也會顯示對其屬性所做的更改 – Phil

+1

@Phil說什麼。如果你在'console.log'行設置了一個斷點,你還可以檢查'jsonData',在這裏你可以看到它確實是'jsonString'的1:1解碼。 – Siguza

回答

2

如果你把你的字符串例如爲小提琴,它似乎解析就好:

https://jsfiddle.net/z67Lgyrm/

什麼是可能發生的事情是,你是你的console.log()電話後改變的數據。當您單擊日誌中的展開箭頭時,它實際上顯示對象現在的值

此外,您似乎在columns數組上使用slice(),但由於它是多維的,因此它只是複製對子數組的引用(即不實際複製值)。

在這裏看到一個可能的解決方案:Create copy of multi-dimensional array, not reference - JavaScript

+0

非常感謝,馬特。 –