# Hash merge question

**URL:** <https://www.ruby-forum.com/t/hash-merge-question/165944>\
**Category:** Ruby\
**Created:** [April 20, 2009, 8:57am UTC](https://www.ruby-forum.com/t/hash-merge-question/165944 "2009-04-20T08:57:18Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![random-query](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/bc79bd/32.png) [@random-query](https://www.ruby-forum.com/u/random-query)\
**Post date:** [April 20, 2009, 8:57am UTC](https://www.ruby-forum.com/t/hash-merge-question/165944/1 "2009-04-20T08:57:18Z")

</div>

Hi All,  
I have 2 hashes like this.

h1 = {  
a1 =\> [y1, y2, y3],  
a2 =\> [y4, y5, y6]  
}  
h2 = {  
a2 =\> [z1, z2, z3],  
a3 =\> [z4, z5, z6]  
}

And I nedd to merge them into something like this.

h = {  
a1 =\> [[y1, y2, y3] , []]  
a2 =\> [[y4, y5, y6] , [z1, z2, z3]]  
a3 =\> [[] , [z4, z5, z6]]  
}

What’s the best way of doing this?  
Thanks a lot for your help!

- RQ

---

<div class="post-metadata">

**Author:** ![random-query](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/bc79bd/32.png) [@random-query](https://www.ruby-forum.com/u/random-query)\
**Post date:** [April 20, 2009, 10:26am UTC](https://www.ruby-forum.com/t/hash-merge-question/165944/2 "2009-04-20T10:26:23Z")

</div>

Random Qu wrote:

> What’s the best way of doing this?

Why don’t you show us what you’ve done so far, whether or not it works,  
and then we can suggest whether there are improvements which can be  
made.

Regards,

Brian.

---

<div class="post-metadata">

**Author:** ![random-query](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/bc79bd/32.png) [@random-query](https://www.ruby-forum.com/u/random-query)\
**Post date:** [April 20, 2009, 11:17am UTC](https://www.ruby-forum.com/t/hash-merge-question/165944/3 "2009-04-20T11:17:13Z")

</div>

#!/usr/bin/ruby  
h1 = {  
:a1 =\> [:y1, :y2, :y3],  
:a2 =\> [:y4, :y5, :y6]  
}  
h2 = {  
:a2 =\> [:z1, :z2, :z3],  
:a3 =\> [:z4, :z5, :z6]  
}  
h = {}  
(h1.keys + h2.keys).each {|k| h[k] = [[],[]] }  
h = h1.to\_a.inject(h) { |i,kv| i[kv[0]][0] = kv[1]; i }  
h = h2.to\_a.inject(h) { |i,kv| i[kv[0]][1] = kv[1]; i }  
p h

gives

{:a2=\>[[:y4, :y5, :y6], [:z1, :z2, :z3]], :a1=\>[[:y1, :y2, :y3],  
[]], :a3=\>[[], [:z4, :z5, :z6]]}

---

<div class="post-metadata">

**Author:** ![random-query](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/bc79bd/32.png) [@random-query](https://www.ruby-forum.com/u/random-query)\
**Post date:** [April 20, 2009, 11:31am UTC](https://www.ruby-forum.com/t/hash-merge-question/165944/4 "2009-04-20T11:31:35Z")

</div>

Thanks Florian!  
That’s what I was after.

---

<div class="post-metadata">

**Author:** ![random-query](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/r/bc79bd/32.png) [@random-query](https://www.ruby-forum.com/u/random-query)\
**Post date:** [April 20, 2009, 1:33pm UTC](https://www.ruby-forum.com/t/hash-merge-question/165944/5 "2009-04-20T13:33:12Z")

</div>

A little bit simpler:

result = {}  
(h1.keys | h2.keys).each { |key| result[key] = [(h1[key] || []),  
(h2[key] || []) }

No need to abuse inject.

Regards  
Stefan

Florian K. wrote:

> #!/usr/bin/ruby  
> h1 = {  
> :a1 =\> [:y1, :y2, :y3],  
> :a2 =\> [:y4, :y5, :y6]  
> }  
> h2 = {  
> :a2 =\> [:z1, :z2, :z3],  
> :a3 =\> [:z4, :z5, :z6]  
> }  
> h = {}  
> (h1.keys + h2.keys).each {|k| h[k] = [[],[]] }  
> h = h1.to\_a.inject(h) { |i,kv| i[kv[0]][0] = kv[1]; i }  
> h = h2.to\_a.inject(h) { |i,kv| i[kv[0]][1] = kv[1]; i }  
> p h
> 
> gives
> 
> {:a2=\>[[:y4, :y5, :y6], [:z1, :z2, :z3]], :a1=\>[[:y1, :y2, :y3],  
> []], :a3=\>[[], [:z4, :z5, :z6]]}
