Ruby ハッシュ値の特定データ取得とソート

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をつけると降順でデータが取得できます。

 

何か参考になれば幸いです(*^^*)

 

[追記]

以下に改良版の記事があるのでよろしければご覧ください(*^^*)

Ruby ハッシュ値の特定データ取得とソート(もっと綺麗なコード編)