2017-07-06 54 views
0

我有一個哈希:如何添加散列到自身並刪除Ruby中的重複?

h = { ["alpha"]=>[{ "bit"=>"100", "colour"=>"red"}, 
        { "id"=>"100", "colour"=>"red"}, 
        { "value"=>"65", "colour"=>"red"}], 
     ["beta"] =>[{ "id"=>"070", "colour"=>"black"}, 
        {"value"=>"338", "colour"=>"black"}] 
} 

我想價值觀哈希值從每一個項目添加到自身和刪除重複對獲得

h = { ["alpha"]=>[{"bit"=>"100", "id"=>"100", "value"=>"65", "colour"=>"red"}], 
     ["beta"] =>[{"id"=>"070", "value"=>"338", "colour"=>"black"}] 
} 

我試過到目前爲止轉換哈希數組並刪除重複但如何將數組再次哈希?我也認爲這不是有效和優雅的解決方案。任何其他想法?

+0

爲什麼你需要數組,如果他們都只有一個元素? –

回答

6

紅寶石> = 2.4.0 - 方法#transform_values與方法#inject#merge

h.transform_values { |v| v.inject(:merge) } 

對於較低的版本:

h.map { |k, v| [k, v.inject(:merge)] }.to_h 
+0

h.transform_values * –

+0

@MatheusSilva當然,謝謝 –

+0

謝謝,它的工作原理:)但你可以解釋一步一步的代碼?我使用低版本的代碼。 – mia102aim

0

較長版本,一步一步,可以看起來像:

h.inject({}) { |result, (key, value)| 
     result[key] = value.inject({}){ |value_result, value_elem| 
      value_result.merge! value_elem; value_result 
     }; result 
    } 

它基本上將散列數組(每個值)轉換爲包含唯一值的單個散列值。但要注意 - 如果你將有散列這樣的:

h = { 
"alpha"=>[{"bit"=>"100", "colour"=>"red"}, {"id"=>"100", "colour"=>"blue"}] 
} 

與關鍵「色」兩個不同的值,輸出將看起來像:

{"alpha"=>{"bit"=>"100", "colour"=>"blue", "id"=>"100"}} 

這是怎麼#merge方法作品。

+0

非常感謝:) – mia102aim

0

這使用Hash#merge的形式來確定兩個散列中正在合併的鍵的值,這裏是所有鍵。

h.merge(h) { |_,arr| arr.reduce(&:merge) } 
    #=> {["alpha"]=>{"bit"=>"100", "colour"=>"red", "id"=>"100", "value"=>"65"}, 
    # ["beta"] =>{"id"=>"070", "colour"=>"black", "value"=>"338"}}