2013-03-31 58 views
2

我有以下陣列應用數組方含重複鍵的哈希

["key", "key_deeper", "key_even_deeper"] 

和哈希:

{ "key" => { "key_deeper" => { "key_even_deeper" => "BINGO!" } } } 

什麼是應用散列數組中最短或表達方式收到"BINGO!"


這是基本情況,但也有一種特殊情況下的價值的關鍵不僅是String => Hash,也String => [Integer, Hash]

例如

["key1", "key2"] 

哈希

{"key1" => [5, {"key2" => "BINGO!" }] } 

應該返回再次"BINGO!",但只包含["key1"]陣列只會返回5

回答

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, :[]) 
+0

這是一個很好的答案,我很欣賞徹底,但是,我只注意到我有另一種情況下,這行代碼是不夠的。我爲問題添加了一個特殊情況。當然,這可以通過在塊中添加條件語句來完成,但它會變得非常混亂,你有什麼想法嗎? –

2

你可以改變原來的答覆一點點你的第二個版本的問題:

array.inject(hash){ |h,i| h[i].is_a?(Array) ? h[i].last : h[i] }