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