哈希散列数组

例如,我有一些单一的哈希

a = [{a: :b}, {c: :d}] 

什么是最好的办法将其转换成此?

 {a: :b, c: :d} 

你可以使用

 a.reduce Hash.new, :merge 

直接产生

 {:a=>:b, :c=>:d} 

请注意,如果发生碰撞,顺序很重要。 后者散列覆盖以前的映射,请参阅:

 [{a: :b}, {c: :d}, {e: :f, a: :g}].reduce Hash.new, :merge # {:a=>:g, :c=>:d, :e=>:f} 

这两个是相同的:

 total_hash = hs.reduce({}) { |acc_hash, hash| acc_hash.merge(hash) } total_hash = hs.reduce({}, :merge) 

请注意, Hash#merge在每次迭代中创build一个新的散列,如果您正在构build一个大散列,这可能是一个问题。 在这种情况下,请使用update

 total_hash = hs.reduce({}, :update) 

另一种方法是将哈希转换成对,然后构build最终的哈希:

 total_hash = hs.flat_map(&:to_a).to_h 

你可以使用.inject

 a.inject(:merge) #=> {:a=>:b, :c=>:d} 

示范

它从两个合并的每个迭代启动一个新的散列。 为了避免这种情况,你可以使用破坏性的:merge! (或:update ,这是一样的):

 a.inject(:merge!) #=> {:a=>:b, :c=>:d} 

示范

尝试这个

 a.inject({}){|acc, hash| acc.merge(hash)} #=> {:a=>:b, :c=>:d}