2017-07-03 3 views
0

JSのhashMapに関する問題があります。私は何回か繰り返されるいくつかのプロパティ "キー"を持っていますが、少なくとも私のhashMapでは最後のものしか見つけません。javascriptを使ってハッシュマップに重複キーのすべての値を表示する方法は?

例:12345 : 1, 12346:3 , 12347:4を:私たちは、キー(12345, 12346, 12346, 12346, 12347)と私はそれが表示される最終的にいくつかの値

12345 <= 1 
12346 <= 2 
12346 <= 1 
12346 <= 3 
12347 <= 4 

属性それぞれについてのこのリストを持っていると仮定してみましょう。しかし、私はまた、私のHashMapに12346 : 1, 12346 : 2の情報が必要です。

12345 : 1 
12346 : {2,1,3} 
12347 : 4 

私はどのように修正することができます:ここでは

が私のコードです:

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

結果:それは最善の解決策だ原因

私はハッシュマップを表示するには、この方法をしたいですそれ?

+0

オブジェクトは不可能です同じキーを複数回持っているあなたは配列を持っていて、その中に項目を押し込むべきです。 – epascarello

+0

ハッシュマップの目的は、すべてのアイテムに一意の識別子があることだと思いました。おそらくデータ構造を変更する必要があります。 – DavidDomain

+0

@DavidDomainあなたが正しいですが、目標は値の配列を持つキーを持つことです。だからうまくいくかもしれませんが、この方法を変更する方法がわかりません –

答えて

0

アイテムは繰り返せないため、キーの値の配列を格納する必要があります。以下は、配列をループして後であると思うものにどのように転送できるかを示す簡単なデモです。

var testData = [ 
 
    {key: "item1", value: 1}, 
 
    {key: "item2", value: 2}, 
 
    {key: "item3", value: 3}, 
 
    {key: "item1", value: 4}, 
 
    {key: "item2", value: 5} 
 
] 
 

 
var out = testData.reduce(function (obj, itm) { 
 
    if (!obj[itm.key]) obj[itm.key] = []; //see if we found this before, if not set it 
 
    obj[itm.key].push(itm.value); //push the value 
 
    return obj //return the object 
 
}, {}) 
 

 
console.log(out); 
 

+0

あなたの答えをありがとうが、私はそれが私の場合から少し離れていると思う。正確には、私はJSONを解析し、ハッシュマップを設定するたびに、私はあなたの解決策を使用することができません。なぜなら、私は二重のキーを持っていないからです。私の機能を見てください –

+0

ロジックは同じです。 – epascarello

+0

plsを説明できますか? –

0

var arr = [12345, 12346, 12346, 12346, 12347]; 
 
var MoMap = new Map() 
 
var count = 1; 
 
for (let i of arr) { 
 
    if (MoMap.has(i)) { 
 
    var val = MoMap.get(i) 
 
    count++; 
 
    val.push(count) 
 
    } else MoMap.set(i, [1]) 
 
} 
 

 
console.log(...MoMap)

+0

@BBenkaddourはあなたの質問に答えてくれますか、もっと微妙なものが必要ですか? – Rick

+0

私は、私の関数で何が起きるのかを段階的に説明します。それぞれのタイプに対して、私はeanを捕まえ、値はhcountです。問題は、例えば12345を見つけ、再び12345を見つけて最後の値を押しつぶしたが、彼が満たしているすべての値を保持したい。私のような値がないので、うまくいかない。 –

+0

@BBenkaddourただし、これらの値は、元のデータセットには含まれていません。パターンを抽出できるように、作業中のデータセットを提供できますか? – Rick

0
var hash = [ 
    { key: 12345, 
     value: 1 
    }, { 
     key: 12347, 
     value: 2 
    }, { 
     key: 12347, 
     value: 3 
    }, { 
     key: 12347, 
     value: 7 
    }]; 

function getFacing() { 
     let result = []; 
     for (let i = 0; i < hash.length; i++) { 
     const element = hash[i]; 
     let index = result.findIndex(elem => elem.key === element.key); 
     if (index === -1) { 
      result.push({ 
      key: element.key, 
      value: [element.value] 
      }); 
     } else { 
      result[index].value.push(element.value); 
     } 
     } 

     return result; 
    } 

getFacing戻り[{12345:[1]}、{12347:[2,3,7]}]