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
告訴讀者該塊變量不用於塊計算。)o
和n
分別是h
和g
中該鍵的值。
對於等於每個鍵k
到"one"
或"two"
,如果arr1.first[k]
和arr2.first[k]
值(散列)具有共同的鍵l
,合併操作會造成在arr1
l
的值將通過l
在值覆蓋arr2
。如果,例如,arr1.first["one"] #=> {"1"=>"a", "2"=>"b"}
和arr2.first["one"] #=> {"8"=>"f", "2"=>"r"}
,合併將返回{"1"=>"a", "2"=>"r", "8"=>"f"}
即使arr1
和arr2
各自含有單個元件(散列),上面的代碼工作正常時,陣列包含多個散列,並且當存在多個比兩個陣列。如果數組總是包含一個散列,數組起不到任何作用,我們可能反而只是參考哈希值:
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
。
我相信你在初始化數組中缺少一些大括號。 – PrestonM
還是不對的,你在arr1結束之前的某個位置丟失了一個右大括號,並且再次在arr2中再次出現了arr3。不匹配的引用比比皆是。所有三個陣列只有一個元素。你什麼意思? –
https://stackoverflow.com/questions/2947255/merging-arrays-of-hashes我會標記爲重複,但該問題的答案可以追溯到2010年,雖然可能是有用的,雖然 – niceman