9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Rubyで配列の中のハッシュの値を取り出す方法

Posted at

久しぶりに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)

9
5
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
9
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?