2012-02-03 75 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