久しぶりにRubyに触れたらびっくりするぐらいわからなかったので調べました。
こんな気持ち悪い配列とハッシュの組み合わせの場合。
test.rb
user_data = [
{ user: { profile: { name: 'George', sex: 'man' } } },
{ user: { profile: { name: 'Alice', sex: 'woman' } } },
{ user: { profile: { name: 'Taro', sex: 'man' } } }
]
配列の中に、userというハッシュがあり、更にネストしてprofileというハッシュがあり、nameというキーに値が入ってる・・・もはやわけがわからんですね。
ではこれを取り出してみます。
'George'を取り出す。
こんな感じ
test.rb
puts user_data[0][:user][:profile][:name]
'Alice'を取り出すなら当然こんな感じ
test.rb
puts user_data[1][:user][:profile][:name]
配列の位置を変えただけ。
'Alice'のハッシュ内にある性別を取り出す場合は
test.rb
puts user_data[1][:user][:profile][:sex]
:nameを:sexに変えただけ。
配列内にある:nameをすべて取り出す
配列なのでeachを使って1つずつ取り出す。
test.rb
user_data.each do |values|
puts values[:user][:profile][:name]
end
結果はこうなる
test.rb
George
Alice
Taro
digメソッドを使う場合
Ruby 2.3以降からはハッシュクラスで新しく使えるメソッドとしてdigというものが用意されています。
digメソッドで'Gorge'を取り出してみる
test.rb
puts user_data.dig(0, :user, :profile, :name)
配列に含まれたハッシュなら、何番のデータがほしいか引数に入れるだけ。
digメソッドで ':name'全て取り出してみる
test.rb
user_data.each do |values|
puts values.dig(:user, :profile, :name)
end
digメソッドを使うメリット
キーが見つからない場合にエラーで返すかnilで返すかの違いのようです。digを使えばnilで返してくれるのでエラーへの対策が不要になるとか。(それまではfetchメソッドを使うなどしていたそうです)
test.rb
user_data = [
{user: {}},
{user: {}},
{user: {}}
]
# digを使った場合
user_data.each do |values|
puts values.dig(:user, :profile, :age)
end
# digを使わなかった場合
user_data.each do |values|
puts values[:user][:profile][:age]
end
こんな感じの結果となる
test.rb
% ruby tmp/test.rb
#=> nil
#=> undefined method `[]' for nil:NilClass (NoMethodError)