Ruby 将包含迭代键的数组应用于哈希
我有以下数组Ruby 将包含迭代键的数组应用于哈希,ruby,arrays,hash,Ruby,Arrays,Hash,我有以下数组 ["key", "key_deeper", "key_even_deeper"] 和散列: { "key" => { "key_deeper" => { "key_even_deeper" => "BINGO!" } } } 在散列上应用数组以接收“宾果!”的最短或最具表现力的方式是什么 这是基本情况,但也有一种特殊情况,其中键的值不仅是String=>Hash,而且是String=>[Integer,Hash] 比如说 ["key1", "key2"]
["key", "key_deeper", "key_even_deeper"]
和散列:
{ "key" => { "key_deeper" => { "key_even_deeper" => "BINGO!" } } }
在散列上应用数组以接收“宾果!”
的最短或最具表现力的方式是什么
这是基本情况,但也有一种特殊情况,其中键的值不仅是
String=>Hash
,而且是String=>[Integer,Hash]
比如说
["key1", "key2"]
关于散列
{"key1" => [5, {"key2" => "BINGO!" }] }
应该再次返回
“宾果!”
,但是只包含[“key1”]
的数组只会返回5
可能最简单的方法是使用inject
:
array.inject(hash) do |h, i|
h.fetch(i){ {} }
end
# => "BINGO!"
fetch
用于防止出现NoMethodError
,以防散列中没有一个查找值。但是,在这种情况下,它将返回一个空哈希。您可能希望改为执行标准查找,即
array.inject(hash) {|h,i| h[i] }
编辑:
这里有一个更简短的方法(我不知道我是否会说它“更具表现力”,但它更简短):
对于第二个问题,您可以稍微更改原始答案:
array.inject(hash){ |h,i| h[i].is_a?(Array) ? h[i].last : h[i] }
这是一个很好的答案,我很欣赏它的彻底性,然而,我刚刚注意到我还有另一个例子,这行代码是不够的。我在问题中加了一个我的问题的特例。当然,这可以通过在块中添加条件语句来实现,但是它会变得非常混乱,你对此有什么想法吗?
array.inject(hash){ |h,i| h[i].is_a?(Array) ? h[i].last : h[i] }