14

次のハッシュがあります。

hash = {'name' => { 'Mike' => { 'age' => 10, 'gender' => 'm' } } }

次の方法で年齢にアクセスできます。

hash['name']['Mike']['age']

Hash#fetchメソッドを使用した場合はどうなりますか?ネストされたハッシュからキーを取得するにはどうすればよいですか?

Sergioが述べたように、(自分で何かを作成せずに)それを行う方法は、一連のfetchメソッドによるものです。

hash.fetch('name').fetch('Mike').fetch('age')
4

8 に答える 8

47

Ruby 2.3.0 以降では、以下を使用できますHash#dig

hash.dig('name', 'Mike', 'age')

また、途中で値の一部が になった場合nilnil代わりに例外が発生するという追加のボーナスも付属しています。

移行するまでruby​​_dig gemを使用できます。

于 2016-01-15T21:23:14.617 に答える
7

編集:組み込みの方法があります。この回答を参照してください。


私が知っている組み込みメソッドはありません。私は現在のプロジェクトでこれを持っています

class Hash
  def fetch_path(*parts)
    parts.reduce(self) do |memo, key|
      memo[key.to_s] if memo
    end
  end
end

# usage
hash.fetch_path('name', 'Mike', 'age')

#fetch(必要に応じて)代わりに使用するように簡単に変更できます#[]

于 2013-10-01T12:26:36.113 に答える
0

中間キーのいずれかが欠落しているときにa を上げることが目標の場合はKeyError、独自のメソッドを作成する必要があります。欠落しているキーのデフォルト値を提供するために fetch を使用している場合は、デフォルト値でハッシュを構築することにより、fetch の使用を回避できます。

hash = Hash.new { |h1, k1| h1[k1] = Hash.new { |h2, k2| h2[k2] = Hash.new { |h3, k3| } } }
hash['name']['Mike']
# {}
hash['name']['Steve']['age'] = 20
hash
# {"name"=>{"Mike"=>{}, "Steve"=>{"age"=>20}}}

これは、任意にネストされたハッシュでは機能しません。構築するときに最大の深さを選択する必要があります。

于 2013-10-01T13:35:03.843 に答える
0

Ruby以下Hashを使用している他のクラスに追加するのではなく、メソッドを使用するバージョン。2.2

def dig(dict, *args)
  key = args.shift
  if args.empty?
    return dict[key]
  else
    dig(dict[key], *args)
  end
end

したがって、次のことができます。

data = { a: 1, b: {c: 2}}
dig(data, :a) == 1
dig(data, :b, :c) == 2
于 2019-01-09T17:00:21.110 に答える
-3

できれば

使用する:

hash[["ayy","bee"]]

それ以外の:

hash["ayy"]["bee"]

それは多くの煩わしさを救うでしょう

于 2014-10-13T11:54:25.323 に答える