pallavi m n
pallavi m n

Reputation: 47

How to group alphabetically array within multiple hash

array = [{:id=>2922, :name=>"anil"}, {:id=>4396, :name=>"vaibav"}, {:id=>4170, :name=>"pallavi"}, {:id=>2085, :name=>"sathu"}, {:id=>3159, :name=>"sridhar"}, {:id=>4512, :name=>"sudheer"}, {:id=>4608, :name=>"henry"}, {:id=>3763, :name=>"vara"}, {:id=>3026, :name=>"sathish"}, {:id=>4099, :name=>"anu"}, {:id=>863, :name=>"anitha"}, {:id=>763, :name=>"parimala"}, {:id=>2963, :name=>"pammi"}, {:id=>2348, :name=>"pinky"}, {:id=>2268, :name=>"pooja"}, {:id=>2938, :name=>"priya"}, {:id=>4312, :name=>"venky"}, {:id=>3416, :name=>"harshitha"}, {:id=>3807, :name=>"hema"}, {:id=>2807, :name=>"hasini"}]

Output should be:

array = [
{"A" => [{:id=>2922, :name=>"anil"}, {:id=>863, :name=>"anitha"}, {:id=>4099, :name=>"anu"}]},{"H" => [{:id=>3416, :name=>"harshitha"}, {:id=>2807, :name=>"hasini"}, {:id=>3807, :name=>"hema"},{:id=>4608, :name=>"henry"}]},
 {"P" => [{:id=>4170, :name=>"pallavi"},{:id=>2963, :name=>"pammi"},{:id=>763, :name=>"parimala"}, {:id=>2348, :name=>"pinky"}, {:id=>2268, :name=>"pooja"}, {:id=>2938, :name=>"priya"}]},
{"S" => [{:id=>2085, :name=>"sathu"}, {:id=>3159, :name=>"sridhar"}, {:id=>4512, :name=>"sudheer"}, {:id=>3026, :name=>"sathish"}]},
{"V" => [{:id=>4312, :name=>"venky"}, {:id=>4396, :name=>"vaibav"},{:id=>3763, :name=>"vara"}]}
]

Upvotes: 0

Views: 49

Answers (2)

Cary Swoveland
Cary Swoveland

Reputation: 110675

array.each_with_object({}) { |g,h| (h[g[:name][0].upcase] ||= []) << g }
  #=> {"A"=>[{:id=>2922, :name=>"anil"}, {:id=>4099, :name=>"anu"},
  #          {:id=>863, :name=>"anitha"}],
  #    "V"=>[{:id=>4396, :name=>"vaibav"}, {:id=>3763, :name=>"vara"},
  #          {:id=>4312, :name=>"venky"}],
  #    "P"=>[{:id=>4170, :name=>"pallavi"}, {:id=>763, :name=>"parimala"},
  #          {:id=>2963, :name=>"pammi"}, {:id=>2348, :name=>"pinky"},
  #          {:id=>2268, :name=>"pooja"}, {:id=>2938, :name=>"priya"}],
  #    "S"=>[{:id=>2085, :name=>"sathu"}, {:id=>3159, :name=>"sridhar"},
  #          {:id=>4512, :name=>"sudheer"}, {:id=>3026, :name=>"sathish"}],
  #    "H"=>[{:id=>4608, :name=>"henry"}, {:id=>3416, :name=>"harshitha"},
  #          {:id=>3807, :name=>"hema"}, {:id=>2807, :name=>"hasini"}]} 

The OP shows the desired hash to have sorted keys (though I don't know whey that would be wanted) and, for each key, an array of hashes that are (almost) sorted by name. An easy way to sort elements in that way, though not the most efficient, is to pre-sort the array of hashes by the values of :name:

array.sort_by { |h| h[:name] }.
      each_with_object({}) { |g,h| (h[g[:name][0].upcase] ||= []) << g }
  #=> {"A"=>[{:id=>2922, :name=>"anil"}, {:id=>863, :name=>"anitha"},
  #          {:id=>4099, :name=>"anu"}],
  #    "H"=>[{:id=>3416, :name=>"harshitha"}, {:id=>2807, :name=>"hasini"},
  #          {:id=>3807, :name=>"hema"}, {:id=>4608, :name=>"henry"}],
  #    "P"=>[{:id=>4170, :name=>"pallavi"}, {:id=>2963, :name=>"pammi"},
  #          {:id=>763, :name=>"parimala"}, {:id=>2348, :name=>"pinky"},
  #          {:id=>2268, :name=>"pooja"}, {:id=>2938, :name=>"priya"}],
  #    "S"=>[{:id=>3026, :name=>"sathish"}, {:id=>2085, :name=>"sathu"},
  #          {:id=>3159, :name=>"sridhar"}, {:id=>4512, :name=>"sudheer"}],
  #    "V"=>[{:id=>4396, :name=>"vaibav"}, {:id=>3763, :name=>"vara"},
  #          {:id=>4312, :name=>"venky"}]} 

Upvotes: 1

Rajagopalan
Rajagopalan

Reputation: 6064

array = [{:id=>2922, :name=>"anil"}, {:id=>4396, :name=>"vaibav"}, {:id=>4170, :name=>"pallavi"}, {:id=>2085, :name=>"sathu"}, {:id=>3159, :name=>"sridhar"}, {:id=>4512, :name=>"sudheer"}, {:id=>4608, :name=>"henry"}, {:id=>3763, :name=>"vara"}, {:id=>3026, :name=>"sathish"}, {:id=>4099, :name=>"anu"}, {:id=>863, :name=>"anitha"}, {:id=>763, :name=>"parimala"}, {:id=>2963, :name=>"pammi"}, {:id=>2348, :name=>"pinky"}, {:id=>2268, :name=>"pooja"}, {:id=>2938, :name=>"priya"}, {:id=>4312, :name=>"venky"}, {:id=>3416, :name=>"harshitha"}, {:id=>3807, :name=>"hema"}, {:id=>2807, :name=>"hasini"}]

Code

p [array.group_by{|x|x[:name].each_char.first}.transform_keys(&:upcase).sort_by{|k,_|k}.to_h]

Output

[{"A"=>[{:id=>2922, :name=>"anil"}, {:id=>4099, :name=>"anu"}, {:id=>863, :name=>"anitha"}], "H"=>[{:id=>4608, :name=>"henry"}, {:id=>3416, :name=>"harshitha"}, {:id=>3807, :name=>"hema"}, {:id=>2807, :name=>"hasini"}], "P"=>[{:id=>4170, :name=>"pallavi"}, {:id=>763, :name=>"parimala"}, {:id=>2963, :name=>"pammi"}, {:id=>2348, :name=>"pinky"}, {:id=>2268, :name=>"pooja"}, {:id=>2938, :name=>"priya"}], "S"=>[{:id=>2085, :name=>"sathu"}, {:id=>3159, :name=>"sridhar"}, {:id=>4512, :name=>"sudheer"}, {:id=>3026, :name=>"sathish"}], "V"=>[{:id=>4396, :name=>"vaibav"}, {:id=>3763, :name=>"vara"}, {:id=>4312, :name=>"venky"}]}]

Upvotes: 1

Related Questions