Ruby:合并数组或哈希

我无法理解如何解决这个问题,本质上我有两个看起来像这样的数组:

第一个数组:

days_to_report #=> [{:date=>Fri, 01 Apr 2011}, #=> {:date=>Sat, 02 Apr 2011}, #=> {:date=>Sun, 03 Apr 2011}, #=> {:date=>Mon, 04 Apr 2011}] 

第二arrays:

 tracks_by_day #=> [{:date=>Mon, 04 Apr 2011, :count=>905, :percentage=>13.205895228367137}, #=> {:date=>Sat, 02 Apr 2011, :count=>6745, :percentage=>98.4240478622501}, #=> {:date=>Fri, 01 Apr 2011, :count=>6853, :percentage=>100.0}] 

在这种情况下,日期是Date对象。

所以我想要合并它们,以便对于第一个数组中的每个项目( days_to_report ),具有第二个数组所具有的数据,就像理想的输出一样:(注意日期的数据,2011年3月3日)

 [{:date=>Mon, 04 Apr 2011, :count=>905, :percentage=>13.205895228367137}, {:date=>Sun, 03 Apr 2011, :count=>0, :percentage=>0}, {:date=>Sat, 02 Apr 2011, :count=>6745, :percentage=>98.4240478622501}, {:date=>Fri, 01 Apr 2011, :count=>6853, :percentage=>100.0}] 

请注意,数组的第二项对于值为零,因为:date不在tracks_by_day数组的哈希值中…有关如何完成此操作的任何想法? 它似乎是zip或其他东西提供的function,但我需要匹配键以查看它们是否存在,如果它们不存在则填充它们的值。

我希望我能正确地描述这一点,再次感谢你们! 举手击掌!

 days = days_to_report.map{|d| d[:date] } - tracks_by_day.map{|d| d[:date]} days.each{ |d| tracks_by_day << {:date => d, :count => 0, :percentage => 0} } 

要么

 days.inject(tracks_by_day){|a,d| a << {:date => d, :count => 0, :percentage => 0}} 

只要没有大量的物品,我就会这样做:

 days_to_report.each do |day_hash| tracks = tracks_by_day.find {|h| h[:date] == day_hash[:date]} day_hash.merge!(tracks || {:count=>0, :percentage=>0}) end 

如果tracks_by_day很大,您可能希望首先将其转换为哈希,将日期映射到其数据。

试试这个:

 idx = tracks_by_day.index_by {|r| r.first } days_to_report.map do |r| data = (idx[r.first] || []).first || {:count=>0, :percentage=>0} r.merge(data) end 
 (days_to_report+tracks_by_day).group_by {|h| h[:date]}. map{|date, (h1, h2)| {:count => 0, :percentage => 0}.merge(h1).merge(h2 || {})}