入れ子構造なハッシュ
ハッシュが複層的に入れ子構造になっていると嫌な感じである。
例えば
user_data = [ { user: { profile: { name: 'Taro' } } }, { user: { profile: { name: 'Jiro' } } }, { user: { profile: { name: 'Saburo' } } } ]
配列の中にuserキーのハッシュがあって、その中にprofileキーのハッシュがあって、その中にnameキーのハッシュがあってそのValueが入っている。あぁもう。
このuser_dataの配列からハッシュの中身のnameだけ取り出すプログラムを書く。
Taro Jiro Saburo
こういう答えになるように。
<答え>
user_data.each do |u|
puts u[:user][:profile][:name]
end
[:key1][:key2][:key3]…と繋げていけばKey1の中のKey2の中のKey3にたどり着く。
または、
user_data.each{ |u| puts u.dig(:user, :profile, :name) }
.digメソッドを使う。ハッシュや配列の中身を再帰的に(入れ子構造を階層を下っていく形式で)参照するメソッドです。
.dig(key1, key2, key3, …)とKeyを指定していく。
配列だと中身の番号を指定するのでこうなる
Array=[ [1, [2, 3]], [4, 5], [6] ]
Array.dig(0, 1, 1) # =>3
配列の1層目の0番のValue:[1,[2,3]] 、の中の2層目の1番[2,3] 、の中の3層目の1番である 3 を参照して呼び出している。
この.digメソッドをしっかり覚えておこう。
<参考サイト> ありがとうございました。
https://docs.ruby-lang.org/ja/latest/method/Hash/i/dig.html