Search code examples
rubyhashruby-hash

Ruby group hashes based on matching keys and store the value of non matching keys in an array


Need to achieve the given output based on the following hash value

foos = [ { :key => 'Foo', :value => 1, :revenue => 2 },
         { :key => 'Foo', :value => 1, :revenue => 4 },
         { :key => 'Bar', :value => 2, :revenue => 7 },
         { :key => 'bar', :value => 2, :revenue => 9 },
         { :key => 'Zampa', :value => 4, :revenue => 9 }]

Output should be :

{ :key => 'Foo', :value => 1, :revenue => [2,4] } #Merging row 1 & 2 as they share same :key 'Foo'
{ :key => 'Bar', :value => 2, :revenue => [7,9] } #Merging row 3 & 4 as they share same :key 'Bar'
{ :key => 'Zampa', :value => 4, :revenue => 9 } 

Merging should be based on the value of the :Key field How to achieve this in ruby as I am new to ruby.


Solution

  • You can try grouping by key and value and then map the revenue values:

    foos
      .group_by { |e| e.values_at(:key, :value) }
      .map do |(key, value), values|
        { key: key, value: value, revenue: values.map { |e| e[:revenue] } }
      end
    # [{:key=>"Foo", :value=>1, :revenue=>[2, 4]}, {:key=>"Bar", :value=>2, :revenue=>[7]}, {:key=>"bar", :value=>2, :revenue=>[9]}, {:key=>"Zampa", :value=>4, :revenue=>[9]}]