将两个哈希与一个共同的钥匙结合在一起



我一直在尝试将两个哈希在ruby中结合在一起。例如:

h1 = { "a" => 10, "b" => 20, "c"=>34, "d"=>3}
h2 = { "a" => 11, "b" => 21, "d"=>15}

我想要的输出是:

h{"a"=> 10, 11, "b"=>20,21, "c"=> 34, "d"=>3,15}

每个哈希都有相同的键,除了第二个哈希可能缺少一些键。我希望这两个值然后由相同的密钥表示。

这是我的未成功代码:

h1 = { "a" => 10, "b" => 20, "c"=>34, "d"=>3}   
h2 = {  "a" => 11, "b" => 21, "d"=>15}  
h3= h1.update(h2){|key1, key2, val1, val2 |key1,h2_val=h2}

它给出:

{"a"=>{"a"=>11, "b"=>21, "d"=>15}, "b"=>{"a"=>11, "b"=>21, "d"=>15}, "c"=>34, "d"=>{"a"=>11, "b"=>21, "d"=>15}}

我只是Ruby的新手,所以我认为我在这里缺少一些非常基本的东西。我将不胜感激任何帮助。

at:

h1 = { "a" => 10, "b" => 20, "c"=>34, "d"=>3} 
h2 = { "a" => 11, "b" => 21, "d"=>15}
p h1.merge(h2){|key, old, new| Array(old).push(new) } #=> {"a"=>[10, 11], "b"=>[20, 21], "c"=>34, "d"=>[3, 15]}

这就是我将其写入的方式以组合2个以上的哈希:

h1 = { "a" => 10, "b" => 20, "c"=>34, "d"=>3} 
h2 = { "a" => 11, "b" => 21, "d"=>15}
h3 = { "a" => 11, "b" => 21, "c"=> 1, "d"=>15}
merge_to_array = -> x,y { x.merge(y){|key, old, new| Array(old).push(new)} }
p [h1,h2,h3].reduce &merge_to_array #=> {"a"=>[10, 11, 11], "b"=>[20, 21, 21], "c"=>[34, 1], "d"=>[3, 15, 15]}
h1 = { "a" => 10, "b" => 20, "c"=>34, "d"=>3}
 h2 = { "a" => 11, "b" => 21, "d"=>15}
 arr= []
 arr << h1 << h2
 data=  arr.map(&:to_a).flatten(1).reduce({}) {|h,(k,v)| (h[k] ||= []) << v; h}

它给出

{"a"=>[10, 11], "b"=>[20, 21], "c"=>[34], "d"=>[3, 15]}

例如使用 #reduce

h1 = { "a" => 10, "b" => 20, "c"=>34, "d"=>3}
h2 = { "a" => 11, "b" => 21, "d"=>15}
h2.reduce(h1.dup) {|h,(k,v)| h[k] = (h[k] && [h[k], v] || v); h}
# => {"a"=>[10, 11], "b"=>[20, 21], "c"=>34, "d"=>[3, 15]}

尚不完全清楚您要寻找的是什么,因为您的示例输出无效,但这是我要合并两个哈希而不踩在钥匙上的方法:

h1 = { "a" => 10, "b" => 20, "c"=>34, "d"=>3}   
h2 = {  "a" => 11, "b" => 21, "d"=>15}  
new_hash = Hash.new{ |h, k| h[k] = [] }
[*h1, *h2].each { |k, v| new_hash[k] << v }

导致:

new_hash # => {"a"=>[10, 11], "b"=>[20, 21], "c"=>[34], "d"=>[3, 15]}

最新更新