2017-06-01 88 views
0

我是Ruby中的新成員。我有散列將哈希合併到數組中

arr1 = [{"one"=> {"1"=> "a", "2" => "b"}, "two" => {"3" => "n", "5" => "h", "7" => "k"}] 
arr2 = [{"one"=> {"8"=> "f", "11" => "r"}, "two" => {"7" => "o", "6" => "b", "14" => "b"}] 

的兩個數組,我想有一個數組是這樣的:

arr3 = [{ 
"one"=> {"1"=> "a", "2" => "b", "8"=> "f", "11" => "r"}, 
"two" => {3" => 'n", "5" => "h", "7" => "k", 7" => 'o", "6" => "b", "14" => "b"} 
] 

所以我想通過鍵合併哈希和「增加」自己的價值觀。誰能幫忙?

+1

我相信你在初始化數組中缺少一些大括號。 – PrestonM

+2

還是不對的,你在arr1結束之前的某個位置丟失了一個右大括號,並且再次在arr2中再次出現了arr3。不匹配的引用比比皆是。所有三個陣列只有一個元素。你什麼意思? –

+0

https://stackoverflow.com/questions/2947255/merging-arrays-of-hashes我會標記爲重複,但該問題的答案可以追溯到2010年,雖然可能是有用的,雖然 – niceman

回答

1
arr1 = [{"one"=>{"1"=>"a", "2"=>"b"}, "two"=>{"3"=>"n", "5"=>"h", "7"=>"k"}}] 
arr2 = [{"one"=>{"8"=>"f", "11"=>"r"}, "two"=>{"7"=>"o", "6"=>"b", "14"=>"b"}}] 

(arr1+arr2).each_with_object({}) { |g,h| h.update(g) { |_,o,n| o.merge(n) } } 
    # => {"one"=>{"1"=>"a", "2"=>"b", "8"=>"f", "11"=>"r"}, 
    #  "two"=>{"3"=>"n", "5"=>"h", "7"=>"o", "6"=>"b", "14"=>"b"}} 

這使用的Hash#update(又名merge!),其使用一個塊({ |_k,o,n| o.merge(n) }),以確定鍵_k的值時被合併兩個散列具有該鍵的形式。 (_,_k告訴讀者該塊變量不用於塊計算。)on分別是hg中該鍵的值。

對於等於每個鍵k"one""two",如果arr1.first[k]arr2.first[k]值(散列)具有共同的鍵l,合併操作會造成在arr1l的值將通過l在值覆蓋arr2。如果,例如,arr1.first["one"] #=> {"1"=>"a", "2"=>"b"}arr2.first["one"] #=> {"8"=>"f", "2"=>"r"},合併將返回{"1"=>"a", "2"=>"r", "8"=>"f"}

即使arr1arr2各自含有單個元件(散列),上面的代碼工作正常時,陣列包含多個散列,並且當存在多個比兩個陣列。如果數組總是包含一個散列,數組起不到任何作用,我們可能反而只是參考哈希值:

h1 = {"one"=>{"1"=>"a", "2"=>"b"}, "two"=>{"3"=>"n", "5"=>"h", "7"=>"k"}} 
h2 = {"one"=>{"8"=>"f", "11"=>"r"}, "two"=>{"7"=>"o", "6"=>"b", "14"=>"b"}} 

[h1+h2]取代arr1+arr2

0

也許不是最優雅的,但這個工程:

arr1 = [{"one"=>{"1"=>"a", "2"=>"b"}, "two"=>{"3"=>"n", "5"=>"h", "7"=>"k"}}] 
arr2 = [{"one"=>{"8"=>"f", "11"=>"r"}, "two"=>{"7"=>"o", "6"=>"b", "14"=>"b"}}] 
arr3 = [] 
arr1[0].each_key{|k| arr3<< {k => arr1[0][k].merge(arr2[0][k])}} 
arr3 

如果你不知道你原來的數組有多少哈希包含,只需用arr1.each_index{|i| arr1[i].each_key替換arr1[0].each_key,並在合併i更換0