ネストされた値の取り出し方に迷うことがあるので、irbで遊んでみました。
3種類の変数を用意します。
>> foods
=> {:key1=>"potato", :key2=>"hamburger"}
>> drinks
=> {:key1=>"coffee", :key2=>"tea"}
>> fruits
=> {:key1=>"apple", :key2=>"orange", :key3=>"grape"}
>> foods
=> {:key1=>"potato", :key2=>"hamburger"}
>> drinks
=> {:key1=>"coffee", :key2=>"tea"}
>> fruits
=> {:key1=>"apple", :key2=>"orange", :key3=>"grape"}
>> foods => {:key1=>"potato", :key2=>"hamburger"} >> drinks => {:key1=>"coffee", :key2=>"tea"} >> fruits => {:key1=>"apple", :key2=>"orange", :key3=>"grape"}
作成した3つの変数を、まとめて変数arryに追加します。
>> arry << foods << drinks << fruits
=> [{:key1=>"potato", :key2=>"hamburger"}, {:key1=>"coffee", :key2=>"tea"}, {:key1=>"apple", :key2=>"orange", :key3=>"grape"}]
>> arry << foods << drinks << fruits
=> [{:key1=>"potato", :key2=>"hamburger"}, {:key1=>"coffee", :key2=>"tea"}, {:key1=>"apple", :key2=>"orange", :key3=>"grape"}]
>> arry << foods << drinks << fruits => [{:key1=>"potato", :key2=>"hamburger"}, {:key1=>"coffee", :key2=>"tea"}, {:key1=>"apple", :key2=>"orange", :key3=>"grape"}]
それぞれ、インデックスを指定すると要素の値を取り出せます。
>> arry[0]
=> {:key1=>"potato", :key2=>"hamburger"}
>> arry[1]
=> {:key1=>"coffee", :key2=>"tea"}
>> arry[2]
=> {:key1=>"apple", :key2=>"orange", :key3=>"grape"}
# 存在しないインデックスを指定するとnilが返される
>> arry[3]
=> nil
>> arry[0]
=> {:key1=>"potato", :key2=>"hamburger"}
>> arry[1]
=> {:key1=>"coffee", :key2=>"tea"}
>> arry[2]
=> {:key1=>"apple", :key2=>"orange", :key3=>"grape"}
# 存在しないインデックスを指定するとnilが返される
>> arry[3]
=> nil
>> arry[0] => {:key1=>"potato", :key2=>"hamburger"} >> arry[1] => {:key1=>"coffee", :key2=>"tea"} >> arry[2] => {:key1=>"apple", :key2=>"orange", :key3=>"grape"} # 存在しないインデックスを指定するとnilが返される >> arry[3] => nil
では、"orange"のみ取り出したいときを考えます。
要素数を指定し、更にキーを指定します。
>> arry[2]
=> {:key1=>"apple", :key2=>"orange", :key3=>"grape"}
>> arry[2][:key2]
=> "orange"
>> arry[2]
=> {:key1=>"apple", :key2=>"orange", :key3=>"grape"}
>> arry[2][:key2]
=> "orange"
>> arry[2] => {:key1=>"apple", :key2=>"orange", :key3=>"grape"} >> arry[2][:key2] => "orange"
キーを適切に指定しないと取り出せません。
>> arry[2][key2]
(irb):66:in `<main>': undefined local variable or method `key2' for main:Object (NameError)
from /Users/xxxxxxxx/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/irb-1.8.1/exe/irb:9:in `<top (required)>'
from /Users/xxxxxxxx/.rbenv/versions/3.2.2/bin/irb:25:in `load'
from /Users/xxxxxxxx/.rbenv/versions/3.2.2/bin/irb:25:in `<main>'
>> arry[2]["orange"]
=> nil
>> arry[2][key2]
(irb):66:in `<main>': undefined local variable or method `key2' for main:Object (NameError)
from /Users/xxxxxxxx/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/irb-1.8.1/exe/irb:9:in `<top (required)>'
from /Users/xxxxxxxx/.rbenv/versions/3.2.2/bin/irb:25:in `load'
from /Users/xxxxxxxx/.rbenv/versions/3.2.2/bin/irb:25:in `<main>'
>> arry[2]["orange"]
=> nil
>> arry[2][key2] (irb):66:in `<main>': undefined local variable or method `key2' for main:Object (NameError) from /Users/xxxxxxxx/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/irb-1.8.1/exe/irb:9:in `<top (required)>' from /Users/xxxxxxxx/.rbenv/versions/3.2.2/bin/irb:25:in `load' from /Users/xxxxxxxx/.rbenv/versions/3.2.2/bin/irb:25:in `<main>' >> arry[2]["orange"] => nil
続いてhashの場合です。
>> hash
=>
{"foods"=>{:key1=>"potato", :key2=>"hamburger"},
"drinks"=>{:key1=>"coffee", :key2=>"tea"},
"fruits"=>{:key1=>"apple", :key2=>"orange", :key3=>"grape"}}
>> hash
=>
{"foods"=>{:key1=>"potato", :key2=>"hamburger"},
"drinks"=>{:key1=>"coffee", :key2=>"tea"},
"fruits"=>{:key1=>"apple", :key2=>"orange", :key3=>"grape"}}
>> hash => {"foods"=>{:key1=>"potato", :key2=>"hamburger"}, "drinks"=>{:key1=>"coffee", :key2=>"tea"}, "fruits"=>{:key1=>"apple", :key2=>"orange", :key3=>"grape"}}
キーを指定すると値を取得できます。
>> hash["foods"]
=> {:key1=>"potato", :key2=>"hamburger"}
>> hash["drinks"]
=> {:key1=>"coffee", :key2=>"tea"}
>> hash["fruits"]
=> {:key1=>"apple", :key2=>"orange", :key3=>"grape"}
>> hash["foods"]
=> {:key1=>"potato", :key2=>"hamburger"}
>> hash["drinks"]
=> {:key1=>"coffee", :key2=>"tea"}
>> hash["fruits"]
=> {:key1=>"apple", :key2=>"orange", :key3=>"grape"}
>> hash["foods"] => {:key1=>"potato", :key2=>"hamburger"} >> hash["drinks"] => {:key1=>"coffee", :key2=>"tea"} >> hash["fruits"] => {:key1=>"apple", :key2=>"orange", :key3=>"grape"}
"orange"を取得したい場合は、2つのキーを指定すれば良いです。
>> hash["fruits"]
=> {:key1=>"apple", :key2=>"orange", :key3=>"grape"}
>> hash["fruits"][:key2]
=> "orange"
>> hash["fruits"]
=> {:key1=>"apple", :key2=>"orange", :key3=>"grape"}
>> hash["fruits"][:key2]
=> "orange"
>> hash["fruits"] => {:key1=>"apple", :key2=>"orange", :key3=>"grape"} >> hash["fruits"][:key2] => "orange"
こちらも配列と同様、 ""
や :
も正確に指定する必要はあります。
適切でない場合はnilやエラーが返ります。
>> hash["fruits"]["key2"]
=> nil
>> hash["fruits"][key2]
(irb):83:in `<main>': undefined local variable or method `key2' for main:Object (NameError)
from /Users/xxxxxxxx/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/irb-1.8.1/exe/irb:9:in `<top (required)>'
from /Users/xxxxxxxx/.rbenv/versions/3.2.2/bin/irb:25:in `load'
from /Users/xxxxxxxx/.rbenv/versions/3.2.2/bin/irb:25:in `<main>'
>> hash["fruits"]["key2"]
=> nil
>> hash["fruits"][key2]
(irb):83:in `<main>': undefined local variable or method `key2' for main:Object (NameError)
from /Users/xxxxxxxx/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/irb-1.8.1/exe/irb:9:in `<top (required)>'
from /Users/xxxxxxxx/.rbenv/versions/3.2.2/bin/irb:25:in `load'
from /Users/xxxxxxxx/.rbenv/versions/3.2.2/bin/irb:25:in `<main>'
>> hash["fruits"]["key2"] => nil >> hash["fruits"][key2] (irb):83:in `<main>': undefined local variable or method `key2' for main:Object (NameError) from /Users/xxxxxxxx/.rbenv/versions/3.2.2/lib/ruby/gems/3.2.0/gems/irb-1.8.1/exe/irb:9:in `<top (required)>' from /Users/xxxxxxxx/.rbenv/versions/3.2.2/bin/irb:25:in `load' from /Users/xxxxxxxx/.rbenv/versions/3.2.2/bin/irb:25:in `<main>'