我有以下数组
["key", "key_deeper", "key_even_deeper"]
和哈希:
{ "key" => { "key_deeper" => { "key_even_deeper" => "BINGO!" } } }
在哈希上应用数组以接收"BINGO!"
的最短或最具表现力的方法是什么?
这是针对基本情况的,但也有一种特殊情况,即键的值不仅是String => Hash
,还有String => [Integer, Hash]
。
例如
["key1", "key2"]
on Hash
{"key1" => [5, {"key2" => "BINGO!" }] }
应该再次返回"BINGO!"
,但只包含["key1"]
的数组只会返回5
。
答案 0 :(得分:6)
可能最简单的方法是使用inject
:
array.inject(hash) do |h, i|
h.fetch(i){ {} }
end
# => "BINGO!"
如果哈希中没有您的查找值,fetch
用于阻止NoMethodError
。但是,在这种情况下,它将返回一个空哈希。您可能希望进行标准查找,即
array.inject(hash) {|h,i| h[i] }
修改强>
这是一个更短的方法(我不知道我是否会说'更具表现力',但它更短):
array.inject(hash, :[])
答案 1 :(得分:2)
您可以针对第二个问题版本更改原始答案:
array.inject(hash){ |h,i| h[i].is_a?(Array) ? h[i].last : h[i] }