入れ子構造のハッシュから特定の値を取り出す(Ruby)

 ※この記事は私自身のアウトプットの記事です。プログラミング初学者向けの内容ではございませんのでご注意ください。

入れ子になっているハッシュから特定の値を取り出す
 ある配列の中身に多重階層になっているハッシュとして定義されたハッシュから、特定の値を取り出したいときにRubyによってどのように記述すれば良いでしょうか。
 それでは例として、複数のユーザーの情報をハッシュとして持つ変数user_dataを定義します。

user_data = [
{user: {profile: {name: 'Mirai'}}},
{user: {profile: {name: 'Shizuka'}}},
{user: {profile: {name: 'Tsubasa'}}},
]

以上の配列user_dataに格納されたハッシュからnameキーのバリュー(値)を出力したいとします。通常、ハッシュから特定の値を取り出す場合には、
ハッシュ[取得したい値のキー]とします。また、ネスト(入れ子)になっているハッシュから特定の値を取得したい場合は、
ハッシュ[取得したい値のキー][取得したい値のキー]とします。すなわち、上記の例のハッシュに対するRubyの記述としては、
ハッシュ[:user][:profile][:name]とします。
 しかし、上記の例では配列user_dataの中にハッシュが格納されています。そのため、今回は配列の一つ一つを順番に取り出して処理を行うeach文を用います。

user_data.each do |u|
 puts u[:user][:profile][:name]
end

 上記の記述ではブロック変数uの中に配列user_dataの中身を順番に代入し特定のハッシュの値を取り出す処理を行いそれを出力しています。今回はnameキーのバリューを出力したいので、ハッシュ[:user][:profile][:name]の形で記述します。その場合に以下のようにネストされたハッシュから特定の値を取り出すことが出来ました。

Mirai
Shizuka
Tsubasa

 また、以下のように

user_data.each do |u|
 puts u[:user][:profile]
end

とした場合は、

{:name=>"Mirai"}
{:name=>"Shizuka"}
{:name=>"Tsubasa"}

上記のようにprofileキーの中身を出力してくれます。

digメソッドを用いてネストされたハッシュから値を取り出す
 その他の方法としては、digメソッドを用いる方法があります。digメソッドは今回のように入れ子構造となったハッシュから安全に値を取り出すことができるメソッドです。

user_data = {user: {profile: {name: 'Mirai'}}}

上記のハッシュから以下のようにdigメソッドを用いて記述すると、

user_data.dig(:user, :profile, :name)
=> "Mirai"

以上のように特定の値を出力することができます。
 何故、digメソッドを用いれば安全に値を取り出すことが出来るかというと、仮にuser_dataのprofileにデータが入っていなかったとします。

user_data = {user: {}}

上記のuser以下のデータが無いハッシュに対して、user_data[:user][:profile]と記述すると結果としてnilが返されます。その上で、
user_data[:user][:profile][:name]と記述すると

NoMethodError (undefined method `[]' for nil:NilClass)

以上のようにエラーが表示されます。しかし、

user_data.dig(:user, :profile, :name)
=> nil

と記述すれば実際のハッシュにキーが存在しない場合でもエラーにならずにnilを返すことが出来ます。digメソッドは発展的な内容ですので参考までに。

この記事が気に入ったらサポートをしてみませんか?