2016-10-03 54 views
1

我有一個非常平坦的JSON,可以有一個屬性不止一次。在我建立了一些邏輯來推出「舊」價值觀之後,我想嘗試一下。然後我發現了很奇怪的東西。我的邏輯總是計算一次屬性,這意味着沒有重複。所以我繼續創建這個虛擬JSON:JSON重複將不會顯示在console.log()

{ 
    "John": { 
     "id": 10001, 
     "name": "John Doe", 
     "iconId": 10, 
     "level": 12, 
     "revisionDate": 1000000000001 
    }, 
    "John": { 
     "id": 10001, 
     "name": "John Doe", 
     "iconId": 10, 
     "level": 12, 
     "revisionDate": 1000000000005 
    }, 
    "Amy": { 
     "id": 10002, 
     "name": "Amy Smith", 
     "iconId": 15, 
     "level": 11, 
     "revisionDate": 1000000000001 
    } 
} 

正如你可以看到這裏的重複是約翰。唯一的區別是他的修訂日期。

現在我加載了JSON中和的NodeJS日誌像這樣:

// loading JSON 
let oldResults = require('./dummy.json'); 
// log JSON  
console.log(oldResults); 

此時,奇怪的事情發生了。我的控制檯會告訴我的第二約翰在我的JSON和艾米,但從來沒有在第一約翰:

λ node debug.js 
{ John: 
    { id: 10001, 
    name: 'John Doe', 
    iconId: 10, 
    level: 12, 
    revisionDate: 1000000000005 }, 
    Amy: 
    { id: 10002, 
    name: 'Amy Smith', 
    iconId: 15, 
    level: 11, 
    revisionDate: 1000000000001 } } 

如果我改變第二約翰John123第一個將被記錄爲他人(不事情如果我改變了第一或第二,其結果將是相同的):

λ node debug.js 
{ John: 
    { id: 10001, 
    name: 'John Doe', 
    iconId: 10, 
    level: 12, 
    revisionDate: 1000000000001 }, 
    John123: 
    { id: 10001, 
    name: 'John Doe', 
    iconId: 10, 
    level: 12, 
    revisionDate: 1000000000005 }, 
    Amy: 
    { id: 10002, 
    name: 'Amy Smith', 
    iconId: 15, 
    level: 11, 
    revisionDate: 1000000000001 } } 

我已經與普通的Windows CMD和CMDER嘗試這個。兩者都顯示出相同的結果。此外,我清除節點緩存,仍然沒有成功......我加載這個JSON在我的debug.js沒有其他的邏輯,這可能會改變JSON。

有人能解釋我爲什麼NodeJS踢出第二個約翰?

問候,Megajin

+1

你究竟希望在他們中有兩個人的時候提及'John'?如果你做了'my_object.John',哪一個會顯示出來。 – 2016-10-03 13:02:57

+0

https://www.google.com/search?q=site%3Astackoverflow.com+javascript+json+duplicate+keys – 2016-10-03 13:04:29

+0

如果您特別想知道日誌記錄,這是相同的答案,除了NodeJS似乎自動解析JSON,這非常令人討厭。哦,這是因爲'。require()',它將其視爲一個JS程序,而不考慮'.json'擴展名。 – 2016-10-03 13:10:15

回答

4

一個給定的屬性名稱只能在給定對象存在一次。如果使用對象初始值設定項創建對象:

var o = { a: "hello", a: "world" }; 

然後最終只有一個名爲「a」的屬性。 (在嚴格模式下,最終會出現錯誤。)

解析JSON時,您遇到同樣的問題:JSON解析器遞增構造對象圖,重複的屬性名將覆蓋以前設置的任何值該財產。

如果您有要序列化爲JSON一些結構,該結構具有多個值,可能是做到這一點的最好辦法是通過給物業一個數組作爲它的值屬性:

{ 
    "John": [ 
    { 
     "id": 10001, 
     "name": "John Doe", 
     "iconId": 10, 
     "level": 12, 
     "revisionDate": 1000000000001 
    }, 
    { 
     "id": 10001, 
     "name": "John Doe", 
     "iconId": 10, 
     "level": 12, 
     "revisionDate": 1000000000005 
    } 
    ], 
    "Amy": { 
     "id": 10002, 
     "name": "Amy Smith", 
     "iconId": 15, 
     "level": 11, 
     "revisionDate": 1000000000001 
    } 
} 
+0

是的...非常好的迴應...! –

+1

謝謝你的回答。這幫了我。我不敢相信我是如此的愚蠢,並沒有意識到我不可能有兩次同樣的鑰匙......猜猜這就是他們所說的「星期一隧道視野」。再次感謝! – Megajin

1

它與節點無關,它是一般的JavaScript原則,當你添加一個屬性時,對象會被增加。

const a = {}; 
a['Jhon'] = {'revisionDate':101}; 
a['Jhon'] = {'revisionDate':102}; 

console.log(a.Jhon); 
//print: {''revisionDate':102} 

這是因爲當您重新初始化它時,會導致對象屬性得到更新。

+1

謝謝你的發球員,波蒂比我快一點,他會得到接受的答案。我仍然贊成你的回答。 – Megajin