我有一个嵌套的数据哈希
foo => {
'user' => {
'address' => {
'street' => '1234'
}
}
}
我可以使用Hash.dig 访问值
foo.dig('user', 'address', 'street')
1234
当值是可变的并且在数组中定义时,您将如何使用hash.dig?
query=["users", "address", "street"]
foo.dig(query) # <= doesn't work
foo.dig(query.to_s) # <= doesn't work
在ruby文档中,Hash.dig似乎采用了多个参数,但没有采用数组
https://ruby-doc.org/core-2.3.0_preview1/Hash.html#method-i-dig
您可以使用splat运算符将数组拆分为参数列表,方法如下:
foo.dig(*query)
对于一个典型的用例,我会使用Alex的答案,但由于它将数组分解为多个参数,因此开销更大,而且输入量大,我会得到一个堆栈太深的错误。除非你有一个庞大的清单,否则这不是你会面临的错误,但无论如何都值得理解。
# one million keys
# note that none of these are actually present in the hash
query = 1.upto(1_000_000).to_a
foo.dig(*query)
# => StackTooDeep
query.reduce(foo) do |memo, key|
memo&.dig(key) || break
end
# => returns nil instantly