arraysrubyhashruby-2.4

Couting of array according to hash key in Ruby


I have an array

data = [{:user=>1399, :job=>10270}, {:user=>2614, :job=>10270},
        {:user=>3112, :job=>10270}, {:user=>2614, :job=>10271},
        {:user=>1455, :job=>10271}]

Where 1399, 2614, 3112, 1455 are user ids and 10270, 10271 are job ids.

I want to show the number of jobs per user regardless of the job id.

Expected result:

1399 => 1
2614 => 2 # because 2614 has 2 two jobs
3112 => 1
1455 => 1

i need this in an array


Solution

  • First group_by the user key and then count the number of elements in each group:

    IMPROVED SOLUTION

    data = [{:user=>1399, :job=>10270}, {:user=>2614, :job=>10270}, {:user=>3112, :job=>10270}, {:user=>2614, :job=>10271}, {:user=>1455, :job=>10271}]
    data.group_by {|e| e[:user]}
      .transform_values(&:size)
    # => {1399=>1, 2614=>2, 3112=>1, 1455=>1}
    
    

    ORIGINAL SOLUTION

    data = [{:user=>1399, :job=>10270}, {:user=>2614, :job=>10270}, {:user=>3112, :job=>10270}, {:user=>2614, :job=>10271}, {:user=>1455, :job=>10271}]
    data.group_by {|e| e[:user]}
      .map{|id, a| [id, a.size]}
      .to_h
    # => {1399=>1, 2614=>2, 3112=>1, 1455=>1}