Ruby hash.dig使用数组作为参数



我有一个嵌套的数据哈希

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

最新更新