Reputation: 99
I have 2 hases:
x = {Sun, 01 Oct 2017=>10, Wed, 01 Nov 2017=>4, Fri, 01 Dec 2017=>2}
y = {Sun, 01 Oct 2017=>7, Wed, 01 Nov 2017=>2, Fri, 01 Dec 2017=>1}
I wanted to group them and get their difference, which should produce this result:
z = {Sun, 01 Oct 2017=>3, Wed, 01 Nov 2017=>2, Fri, 01 Dec 2017=>1}
Upvotes: 2
Views: 31
Reputation: 99
ar = x , y
z = p ar.inject{|memo, el| memo.merge( el ){|k, old_v, new_v| old_v - new_v}}
Upvotes: 1
Reputation: 12203
You can use reduce
to achieve this, as follows:
z = x.reduce({}) do |z_hash, (key, val)|
next z_hash unless y[key]
z_hash[key] = val - y[key]
z_hash
end
Alternatively, and more built to purpose, you could use:
z = x.merge(y) { |key, v1, v2| v1 - v2 }
The first approach allows you to easily skip keys that don't appear in both hashes, while the second is what I'd recommend - merge takes an optional block for cases like this.
It's readable and gets exactly the output you'd expect.
Hope that helps - give me a shout if you've any questions :)
Upvotes: 2