tawara's blog

雑記。個人の見解です。

ネストしたhashのvalueをグルーピングしたい

[2] pry> hash2
=> {nil=>{"カテゴリ未設定1"=>1},
 3=>
  {"王様の性別_1"=>1,
   "王様の性別_2"=>2,
   "王様の性別_3"=>3,
   "王様の性別_4"=>4,
   "王様の年収_1"=>1,
   "王様の年収_2"=>2,
   "王様の年収_3"=>3,
   "王様の年収_4"=>4,
   "王様のごはん_1"=>1,
   "王様のごはん_2"=>2,
   "王様のごはん_3"=>3,
   "王様のごはん_4"=>4},
 2=>
  {"ペットの名前_1"=>1,
   "ペットの名前_2"=>2,
   "ペットの名前_3"=>3,
   "ペットのご飯_1"=>1,
   "ペットのご飯_2"=>2,
   "ペットのご飯_3"=>3,
   "ペットの好み_1"=>1,
   "ペットの好み_2"=>2,
   "ペットの好み_3"=>3,
   "ペットの種類_1"=>1,
   "ペットの種類_2"=>2,
   "ペットの種類_3"=>3,
   "ペットの年収_1"=>1,
   "ペットの年収_2"=>2,
   "ペットの年収_3"=>3},
 4=>{"子供の洋服"=>1}}

このhashを、、、下記のような配列にしたい。8時間くらい悩んでわからなかったので、友人たち質問したらすぐに解決できた。

[カテゴリ未設定1,王様の性別_1,王様の年収_1,王様のごはん_1,...王様の性別_4,王様の年収_4,王様のごはん_4,ペットの名前_1,ペットのご飯_1,ペットの好み_1,ペットの種類_1,ペットの年収_1...ペットの名前
_3,ペットのご飯_3,ペットの好み_3,ペットの種類_3,ペットの年収_3,子供の洋服]

##回答例1

hash2.map{ |key, value| value.sort_by{ |key, value| value}.map{ |array| array[0]}}.flatten

##回答例2

hash.values.flat_map{ |value| value.sort_by{ |key, value| value }.map(&:first) }

##回答例3

hash2.inject([]){|a, (_,v)| a + v.group_by(&:last).flat_map{|_,v| v.collect(&:first)}}

みなさんすごい。

(了)