入れ子構造なハッシュ

ハッシュが複層的に入れ子構造になっていると嫌な感じである。

 

例えば

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