我有一系列像这样的哈希:
[ {:foo=>2, :date=>Sat, 01 Sep 2014},
{:foo2=>2, :date=>Sat, 02 Sep 2014},
{:foo3=>3, :date=>Sat, 01 Sep 2014},
{:foo4=>4, :date=>Sat, 03 Sep 2014},
{:foo5=>5, :date=>Sat, 02 Sep 2014}]
如果:date
相同,我想合并哈希值。
我对上面数组的期望是:
[ {:foo=>2, :foo3=>3, :date=>Sat, 01 Sep 2014},
{:foo2=>2, :foo5=>5 :date=>Sat, 02 Sep 2014},
{:foo4=>4, :date=>Sat, 03 Sep 2014}]
我该怎么做?
也许我应该重新考虑数据结构本身?例如,我应该使用date
值作为哈希的键吗?
答案 0 :(得分:8)
以下是如何在一行(demo)中执行此操作:
hashes.group_by{|h| h[:date] }.map{|_, hs| hs.reduce(:merge)}
此代码执行以下操作:
:date
值:date
组,获取其中的所有哈希并将它们全部合并为一个哈希编辑: 由tokland和Cary Swoveland建议的应用修改。谢谢!的
答案 1 :(得分:0)
您可以使用Hash#update(a.k.a。merge!
)的形式,该形式使用块来解析合并后的两个哈希中包含的键的值。
arr = [ {:foo=>2, :date=>'Sat, 01 Sep 2014'},
{:foo2=>2, :date=>'Sat, 02 Sep 2014'},
{:foo3=>3, :date=>'Sat, 01 Sep 2014'},
{:foo4=>4, :date=>'Sat, 03 Sep 2014'},
{:foo5=>5, :date=>'Sat, 02 Sep 2014'}]
arr.each_with_object({}) do |g,h|
h.update({ g[:date]=>g }) { |_,o,n| o.merge(n) }
end.values
#=> [{:foo=>2, :date=>"Sat, 01 Sep 2014", :foo3=>3},
# {:foo2=>2, :date=>"Sat, 02 Sep 2014", :foo5=>5},
# {:foo4=>4, :date=>"Sat, 03 Sep 2014"}]
我使用占位符_
作为包含键值的块变量,因为它没有在块中使用。