Reputation: 47
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
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
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