哈希散列数组
例如,我有一些单一的哈希
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}