LoginSignup
1
0

More than 1 year has passed since last update.

多重ハッシュから値を取得する

Posted at

rubyの知識を問題を解きながら、何が分かってて何が分かっていないかを洗い出して、復習するシリーズ

という知識を深める用アウトプットをしていくよ

ではさっそく。vol.2

問題

配列の内部に、複数のユーザーの情報をハッシュとして持つ変数user_data

user_data = [
 {user: {profile: {name: 'Abc'}}},
 {user: {profile: {name: 'Def'}}},
 {user: {profile: {name: 'Ghi'}}},
]

全てのユーザーの「名前だけ」が出力されるように記述する。

期待する出力結果
Abc
Def
Ghi

試行錯誤で戦った経過。不毛すぎるから折りたたみ。

user_dataの定義部分は省略して書く。

戦い1 なんかこんな感じのはず
user_data.each do |data|
  puts data.user.profile.name
end
結果
Traceback (most recent call last):
        2: from test.rb:15:in `<main>'
        1: from test.rb:15:in `each'
test.rb:16:in `block in <main>': undefined method `user' for {:user=>{:profile=>{:name=>"Abc"}}}:Hash (NoMethodError)
Did you mean?  super

はい、すみません。

戦い2 こうか?
user_data.each do |data|
  puts data{name}{profile}{name}
end
結果
test.rb:16: syntax error, unexpected '{', expecting end
  puts data{name}{profile}{name}

ですよねー。

戦い3 なんかこんなのなかったっけ
user_data.each do |data|
  puts data{{{name}}}
end
結果
test.rb:16: syntax error, unexpected '}', expecting =>
  puts data{{{name}}}


結果、こうすると思うように出力できました。

回答
user_data = [
  {user: {profile: {name: 'Abc'}}},
  {user: {profile: {name: 'Def'}}},
  {user: {profile: {name: 'Ghi'}}},
 ]

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

キーの指定の仕方がまだ不慣れです。

さて、おさらい

ハッシュから欲しい値を取得するには

ハッシュ名[欲しい値のキー]
(例)user_data[:user]

ちなみに問題のuser_dataで↑のようにuserだけ指定するとこのように↓返ってきました。

{:profile=>{:name=>"Abc"}}
{:profile=>{:name=>"Def"}}
{:profile=>{:name=>"Ghi"}}

今回はもっと先のnameまで指定して取得したい。
→ハッシュが多重になっている。
キーを連続して書く

ハッシュ名[値のキー][値のキー][値のキー]
(例)user_data[:user][:profile][:name]

ちなみにこういう書き方もあるそう

模範解答2
user_data.each{ |data| puts data.dig(:user, :profile, :name) }

digメソッドについてはまた勉強します。

まとめ?

んんん、正直あんまりすとんと落ちてきてない。
でも、必要なキーのところ(今回ならname)までのキーを順番に記述するのはすっきり。
最初のお試しそうしてたしね。
基礎理解が浅いまま進んでてごっちゃになってます。
今回は[:user]この書き方をインプット。多重ハッシュの手前の基礎部分ですね。

一度苦手意識を持つと頭に入ってきづらくなるのは自分の性質なので、焦らず向き合っていこうと思います。

間違ってること、もっとこうしたらいいよというアドバイスなどありましたら、コメントいただけると嬉しいです。

では、また次の投稿で。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0