Rubyでハッシュ値から特定データを取得した後
ソートをする処理についてです。
まずは、特定データを取得してみます。
SETTING = { house: { price: 50000, size: 120, category: 1, rank: 1 }, desk: { price: 5000, size: 100, category: 2, rank: 3}, clothes: { price: 5000, size: 100, category: 3, rank: 1}, chair: { price: 3000, size: 30, category: 2, rank: 2}, tv: { price: 25000, size: 100, category: 2, rank: 1}, } def create_data_by_category(category) data = Hash.new SETTING.each do |key, value| if value[:category] == category data[key] = value end end data end # カテゴリー2のデータを生成 puts create_data_by_category(2) # 戻り値 # { # :desk=>{:price=>5000, :size=>100, :category=>2, :rank=>3}, # :chair=>{:price=>3000, :size=>30, :category=>2, :rank=>2}, # :tv=>{:price=>25000, :size=>100, :category=>2, :rank=>1} # }
categoryが2のハッシュ値を定義した順番で取得できていますね。
次にrankの昇順でデータを取得するためにソートをしていきます。
ソートではsort_byを使います。
SETTING = { house: { price: 50000, size: 120, category: 1, rank: 1 }, desk: { price: 5000, size: 100, category: 2, rank: 3}, clothes: { price: 5000, size: 100, category: 3, rank: 1}, chair: { price: 3000, size: 30, category: 2, rank: 2}, tv: { price: 25000, size: 100, category: 2, rank: 1}, } def create_data_by_category(category) data = Hash.new SETTING.each do |key, value| if value[:category] == category data[key] = value end end data = Hash[data.sort_by{ | k, v | v[:rank] }] end # カテゴリー2のデータを生成 puts create_data_by_category(2) # 戻り値 # { # :tv=>{:price=>25000, :size=>100, :category=>2, :rank=>1}, # :chair=>{:price=>3000, :size=>30, :category=>2, :rank=>2}, # :desk=>{:price=>5000, :size=>100, :category=>2, :rank=>3} # }
rank1,2,3の順にソートされていますね!
降順にしたい場合は、data.sort_by{ | k, v | v[:rank] }.reverse という感じで
reverseをつけると降順でデータが取得できます。
何か参考になれば幸いです(*^^*)
[追記]
以下に改良版の記事があるのでよろしければご覧ください(*^^*)