2017-07-03 71 views
0

我有一個關於我在JS中的哈希映射的問題。我有一些屬性「鍵」重複多次,但至少在我的哈希映射中,我只找到最後一個。如何在JavaScript中使用hashmap顯示重複鍵的所有值?

例如:讓我們假設有鑰匙(12345, 12346, 12346, 12346, 12347)列表,然後爲每一個我的屬性的一些值

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

在它顯示最後:12345 : 1, 12346:3 , 12347:4。但我也需要在我的HashMap中的這些信息12346 : 1, 12346 : 2

這裏是我的代碼:

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; 
      } 

結果:

我要顯示我的HashMap這樣的原因這是最好的解決辦法:

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

如何解決它?

+0

它的目的是不可能多次具有相同的密鑰。你應該有一個數組並將它們推入其中。 – epascarello

+0

我認爲hashmap的目的是每個項目都有一個唯一的標識符。也許你應該改變你的數據結構。 – 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,並且每次我設置hashMap,我都不能使用你的解決方案,因爲從開始我沒有重複的鍵。看看我的功能 –

+0

邏輯是一樣的。 – epascarello

+0

你能解釋嗎? –

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

@Benkaddour這是回答你的問題,還是你需要更多的細微差別? – Rick

+0

我會一步一步解釋你在我的函數中發生了什麼......對於每一種類型,我都會抓住ean,並且我將屬性看作是hcount的值。所以問題是,例如,他發現12345並且他屬性爲3,然後他再次開創12345和粉碎過去的價值,但我希望將所有他遇到的值。對於我沒有值像你這樣做是行不通的時刻。 –

+0

@Benkaddour但是,這些值不在您提供的原始數據集中,您能否提供您正在處理的數據集,以便可以提取模式。 – 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]}]