Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 将包含迭代键的数组应用于哈希_Ruby_Arrays_Hash - Fatal编程技术网

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] }