将包含键迭代器的数组应用于哈希

时间:2013-03-31 00:38:28

标签: ruby arrays hash

我有以下数组

["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

2 个答案:

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