2012-02-03 125 views
1

我已經閱讀了很多帖子,但似乎沒有人這樣做,這有點棘手。包含紅寶石數組哈希陣列的散列

說我有一個包含數組作爲其值之一的散列。

hash = { 
    :a => 'one', 
    :arr => [ 
    {:id => 'ten', :amount => 10, :b => 'two'}, 
    {:id => 'twenty', :amount => 20, :b => 'two'}, 
    {:id => 'apple', :amount => 7, :b => 'applesauce'} 
    ], 
    :c => 3 
} 

欲將此轉換爲哈希值的陣列(這將是所包含的陣列的大小的),如下所示:

# => [ 
    {:a => 'one', :id => 'ten', :amount => 10, :b => 'two',  :c => 3}, 
    {:a => 'one', :id => 'twenty', :amount => 20, :b => 'two',  :c => 3}, 
    {:a => 'one', :id => 'apple', :amount => 7, :b => 'applesauce', :c => 3} 
] 

轉換應保持任何鍵/值對是內部和陣列外,最好我能傳遞數組的關鍵要求它執行的操作:

flatten_hash_array(hash, :arr) 

我意識到了Ruby flatten Array類中是不是有什麼 我們需要。抓住動詞!任何幫助,將不勝感激。

回答

5

這應該做的工作,禁止有效性檢查。

def flatten_hash_array(hash, key) 
    hash[key].map {|entry| entry.merge(hash.reject {|k| k == key})} 
end 
+0

太棒了! hash.reject塊只需要通過k,v,它就像一個魅力。謝謝! def flatten_hash_array(hash,key) hash [key] .map {| entry | entry.merge(hash.reject {| k,v | k == key})} end – adamrneary 2012-02-03 18:10:16

+0

嗯,必須是1.8/1.9的差異 - 我的Ruby接受'hash.reject {| k |}',即使有是兩個可用的參數。但是,嘿 - 很高興它適合你。 – Chowlett 2012-02-03 21:22:00