Rubyでハッシュが格納された配列から、ハッシュを検索して取得する方法を紹介します。
Hash内の文字列で検索
nameが「佐藤」のデータを取得する場合
members = [
{:name=>"佐藤", :age=>20, :like=>["baseball", "tennis"]},
{:name=>"田中", :age=>24, :like=>["boxing"]},
{:name=>"加藤", :age=>19, :like=>["baseball"]}
]
members.find{|hash| hash[:name] == "佐藤" }
=> {:name=>"佐藤", :age=>20, :like=>["baseball", "tennis"]}
Hash内の数値で検索
ageが20以上のデータを全て取得する場合。
members = [
{:name=>"佐藤", :age=>20, :like=>["baseball", "tennis"]},
{:name=>"田中", :age=>24, :like=>["boxing"]},
{:name=>"加藤", :age=>19, :like=>["baseball"]}
]
members.select{|hash| hash[:age] >= 20 }
=> [{:name=>"佐藤", :age=>20, :like=>["baseball", "tennis"]}, {:name=>"田中", :age=>24, :like=>["boxing"]}]
条件に一致するデータを全て取得する時はfindじゃなくてselectを使います。
Hash内の配列で検索
likeにbaseballがある全てのデータを取得する場合。
members = [
{:name=>"佐藤", :age=>20, :like=>["baseball", "tennis"]},
{:name=>"田中", :age=>24, :like=>["boxing"]},
{:name=>"加藤", :age=>19, :like=>["baseball"]}
]
members.select{|hash| hash[:like].include?("baseball") }
=> [{:name=>"佐藤", :age=>20, :like=>["baseball", "tennis"]}, {:name=>"加藤", :age=>19, :like=>["baseball"]}]
検索条件を組み合わせる
nameに「”藤”」を含んで、且つageが20未満のデータを一つ取得する場合。
members = [
{:name=>"佐藤", :age=>20, :like=>["baseball", "tennis"]},
{:name=>"田中", :age=>24, :like=>["boxing"]},
{:name=>"加藤", :age=>19, :like=>["baseball"]}
]
members.select{|hash| hash[:name].include("藤") && hash[:age] < 20 }
=> {:name=>"加藤", :age=>19, :like=>["baseball"]}