2017-06-01 92 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