2016-10-03 5 views
1

属性が2回以上ある非常にフラットなJSONがあります。私が「古い」価値観を追い出すためにいくつかの論理を構築した後、私はそれをもちろん試してみたかったのです。それから、私は本当に奇妙なことを発見しました。私のロジックは、重複がないことを意味する属性を常に1回カウントしました。だから私は先に進んでこのダミーの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 
    } 
} 

ここでは重複がわかります。唯一の違いは彼のリビジョン日付です。奇妙なことが起こる。この時点で

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

今私はNodeJSでJSONをロードし、このようにそれをログに記録します。私のコンソールには、私の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に2つ目のジョンを変更した場合は最初のものは他のものとして記録されます(しません私は第一又は第二を変更した場合、結果は同じになります物質):

λ 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を変更する可能性のある他のロジックなしで、このJSONを私のdebug.jsにロードします。

NodeJSが2番目のJohnを追い出している理由を教えてもらえますか?

よろしく、Megajin

+1

ジョンがそこに2人いるとき、どのように「ジョン」を参照したいと思っていたのですか?あなたが 'my_object.John'を実行すると、どちらが表示されますか? –

+0

https://www.google.com/search?q=site%3Astackoverflow.com+javascript+json+duplicate+keys –

+0

特にロギングについて不思議だったら、NodeJSが自動的に解析するように見える点を除いて同じ回答ですかなり有害であるJSON。 ...ああ、それは 'のためだ。require() 'は' .json'拡張にかかわらずJSプログラムとして見えます。 –

答えて

4

は、指定されたプロパティ名が指定されたオブジェクトに一度しか存在し得ません。オブジェクト初期化子を使用してオブジェクトを作成した場合:

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

この場合、「a」という1つのプロパティで終了します。 (strictモードではエラーになります)

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

ありがとうございます。これは私を助けた。私は私がとてもばかばかしいと信じることはできませんし、私は同じキーを2回持つことができないことを認識していませんでした...彼らが "Monday Tunnel Vision"と呼んでいると思います。再度、感謝します! – Megajin

1

これはNodeとは関係がありません。プロパティを追加したときにオブジェクトが拡張されるという一般的なJavaScriptの原則です。

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

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

これは、オブジェクトプロパティを再初期化したときに更新されるためです。

+1

あなたの担当者にありがとう、Pointyはちょっと早く、受け入れられる答えを得るでしょう。まだ私はあなたの答えをupvoted。 – Megajin

関連する問題