Ruby:合并数组或哈希

时间:2011-04-04 22:27:25

标签: ruby-on-rails ruby

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

第一个阵列:

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

第二阵列:

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),具有第二个数组所具有的数据,就像理想输出那样:(注意数据为Sun的日期,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中提供的功能或其他功能,但我需要匹配键以查看它们是否存在,如果不存在则填充其值。

我希望我能正确地描述这一点,再次感谢你们!高五!

4 个答案:

答案 0 :(得分:2)

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} }

OR

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

答案 1 :(得分:1)

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

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很大,您可能希望先将日期转换为哈希,然后将日期映射到数据。

答案 2 :(得分:1)

试试这个:

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

答案 3 :(得分:0)

(days_to_report+tracks_by_day).group_by {|h| h[:date]}.
   map{|date, (h1, h2)| {:count => 0, :percentage => 0}.merge(h1).merge(h2 || {})}