Home > Blockchain >  Consolidating a Ruby Array of Hashes
Consolidating a Ruby Array of Hashes

Time:10-18

I'm interning at a company right now, and I have a database that I connect to in order to get some specific data about our customers. The query is all worked out, the database is returning the data I need, but now I need to figure out how to consolidate the data into the necessary format. We are using Ruby 3.1.2 for reference.

This is the format that I receive from our database (the real data will be much larger, so I'm only using a small dataset until the logic is solid).

[{ "product_id"=>1, "customer_id"=>001 },
 { "product_id"=>2, "customer_id"=>001 },
 { "product_id"=>1, "customer_id"=>002 },
 { "product_id"=>3, "customer_id"=>002 },
 { "product_id"=>1, "customer_id"=>003 },
 { "product_id"=>2, "customer_id"=>003 },
 { "product_id"=>3, "customer_id"=>003 }]

When I get this data, I need to get a list of each distinct "customer_id" with a list of every "product_id" they have assigned to them. Example of what I need to get back below.

{001=>[1, 2], 002=>[1, 3], 003=>[1, 2, 3]}

I thought I had a solution with the line below, but it doesn't seem to work how I expected.

data.group_by(&:customer_id).transform_values { |p| p.pluck(:product_id) }

CodePudding user response:

In addition to #group_by one might use #each_with_object to iteratively build the needed hash.

data.each_with_object({}) { |x, h| 
  h[x["customer_id"]] ||= []
  h[x["customer_id"]] << x["product_id"] 
}
# => {1=>[1, 2], 2=>[1, 3], 3=>[1, 2, 3]}

CodePudding user response:

I would do this:

array = [{ "product_id"=>1, "customer_id"=>001 },
         { "product_id"=>2, "customer_id"=>001 },
         { "product_id"=>1, "customer_id"=>002 },
         { "product_id"=>3, "customer_id"=>002 },
         { "product_id"=>1, "customer_id"=>003 },
         { "product_id"=>2, "customer_id"=>003 },
         { "product_id"=>3, "customer_id"=>003 }]

array.group_by { |hash| hash['customer_id'] }
     .transform_values { |values| values.map { |value| value['product_id'] } }
#=> { 1 => [1, 2], 2 => [1, 3], 3 => [1, 2, 3] }
  • Related