Насколько я знаю, в Ruby нет понятия отсортированного хэша / карты, поэтому вы ограничены старыми добрыми массивами для этого. Вы можете начать с этого кода:
output = input.inject({}) { |acc, pair|
letter = pair.first[0].chr
acc[letter] ||= {}
acc[letter][pair.first] = pair.last
acc
}.sort
Это даст вам структуру данных в форме
[ ["a", {"aa"=>"aavalue",
"ab"=>"abvalue"}],
["b", {"ba"=>"bavalue"}],
["x", {"xa"=>"xavalue"}]]
Путем отображения массивов компонентов в хэши ...
output.map {|pair| {pair.first => pair.last}}
Вы можете превратить его во что-то вроде
[{"a"=>{"aa"=>"aavalue",
"ab"=>"abvalue"}},
{"b"=>{"ba"=>"bavalue"}},
{"x"=>{"xa"=>"xavalue"}}]
Имея похожую карту, вы можете перейти к последней указанной вами форме (output2):
output2 = output.map { |pair|
hash = pair.last
{ 'name' => pair.first,
'keys' => hash.keys,
'values' => hash.values }
}