2017-07-06 15 views
0

JSONを解析し、いくつかの操作でデータを使用するためのハッシュマップを作成する関数を作成しました。私が見つけた問題は、私のキーが何度か繰り返され、ハッシュマップでキーごとに1つの値しかないということです。私はそれになりたい方法は、この例のようなものです:JSONの解析とハッシュマップの作成

12345 : 5 
12346 : 4 
12346 : 3 

My機能は、この返却:だから再開する{ 12345 : 5 , 12346 : 3 } を、それが設立された最後の値とキーをオーバーロード。私の場合は

私はすべてこの値を必要とするので、私はこのような結果が欲しい:私は別のキーを見つけた場合、私は変更する必要があります値:=>

{ 12345 : 5 , 12346 : [4,3] } 

目的

の検索結果をそれを過負荷にしないでください。 最初のソリューション:あなたは(あなたが望むものに基づいて)にそれらを変更する必要が

if (iSceneGraph.merch.type === "Facing"){ 
    facingArray[iSceneGraph.merch.ean] = iSceneGraph.merch.hcount; 
} 

:あなたがここに値をオーバーライドしている

getFacingCount: function(iSceneGraph){ 
       var facingArray = {}; 
       if (iSceneGraph.children.length > 0){ 
        for (var i = 0; i < iSceneGraph.children.length; i++){ 
         facingArray = Object.assign(facingArray, this.getFacingCount(iSceneGraph.children[i])); 
        } 
       } 
       if (iSceneGraph.merch.type === "Facing"){ 
        facingArray[iSceneGraph.merch.ean] = iSceneGraph.merch.hcount; 
       } 
       return facingArray; 
      } 
+3

私は、例えば、ハッシュマップデータの一貫性のある構造を持つことをお勧めします12345:[5]、12346:[3,4]ので、常にハッシュマップ[12345]を実行できます。forEach –

+0

この種の結果が必要になりますか? '{12345:[[1、2、3]]、12346:[[4,5,6]、[7,8,9]}'結果の種類{12345:[1,2,3]、12346:[4,5,6,7,8,9]}?あなたが後者を望むなら、私は答えを – samAlvin

+0

以下に更新しました。反復プロパティ名を持つオブジェクトを持つことは不可能です: '{12345:5,12346:4,12346:3} 'そして結果としてあなたは結果を得ます:' {12345 :5、12346:3} ' –

答えて

0

:ここ

は私の関数であります

if (iSceneGraph.merch.type === "Facing" && (facingArray[iSceneGraph.merch.ean] == undefined || facingArray[iSceneGraph.merch.ean] == null)){ 
    facingArray[iSceneGraph.merch.ean] = iSceneGraph.merch.hcount; 
} else if (iSceneGraph.merch.type === "Facing" && Array.isArray(facingArray[iSceneGraph.merch.ean])){ 
    facingArray[iSceneGraph.merch.ean].push(iSceneGraph.merch.hcount); 
} else if (iSceneGraph.merch.type === "Facing") { 
    facingArray[iSceneGraph.merch.ean] = [facingArray[iSceneGraph.merch.ean]]; 
    facingArray[iSceneGraph.merch.ean].push(iSceneGraph.merch.hcount); 
} 

第二の溶液

if (iSceneGraph.merch.type === "Facing"){ 
    if (facingArray[iSceneGraph.merch.ean] == undefined || facingArray[iSceneGraph.merch.ean] == null) { 
     facingArray[iSceneGraph.merch.ean] = []; 
    } 

    facingArray[iSceneGraph.merch.ean].push(iSceneGraph.merch.hcount); 
} 

場合:ジョナスが言うと、あなたのソリューションは、このようになるだろうからしかし、私の意見では、私はあなただけのコメントのようなハッシュマップデータの一貫性のある構造を持っていることを好みますあなたはハッシュマップデータの一貫した構造を持っているので、データをより簡単に扱うことができます。私の最初のソリューションを参照してください、それは2番目のソリューションは2つの条件を必要とする間、それは3つの条件があります。データの一貫した構造により、「データのすべてのタイプをどのように扱うべきか」を考えないようにすることができます。

----------- UPDATE -----------------

あなたが今プッシュする場合は、あなたのフィードバックに答えます代わりに、整数の配列は、あなたはこの形式になります

facingArray[iSceneGraph.merch.ean] = facingArray[iSceneGraph.merch.ean].concat(positionList); 

結果に

// `positionList` is an array of integer 
facingArray[iSceneGraph.merch.ean].push(positionList); 

を変更することができます。{ 12345: [1,2,3], 12346: [4,5,6,7,8,9] }

+0

それは私がやったことと同じですが、それも最初のケースではうまくいきませんでした.. –

0

は、あなたのJSONオブジェクトの配列のように見えると仮定:[{12345: 5}, {12346: 4}, {12346: 3}]あなたがArray.prototype.reduce()を使用することができます。

var json = [{12345: 5}, {12346: 4}, {12346: 3}], 
 
    result = json.reduce(function (acc, obj) { 
 
     var key = Object.keys(obj); 
 
     acc[key] = !acc[key] ? obj[key] : [].concat(acc[key], obj[key]); 
 
     return acc; 
 
    }, {}); 
 

 
console.log(result);

+0

これは私が探しているものではありません、私はそれらの値を持っていません..私の機能を確認してください –

+0

ですこれはあなたのJSONの構造です: '{{12345:5}、{12346:4}、{12346:3}]? –