2011-04-04 97 views
4

我無法理解如何來解決這個問題,基本上我有兩個數組看起來像:紅寶石:合併數組或哈希

第一陣列:

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),都有第二個數組也有數據,就像理想的輸出是:(注意數據的日期孫,03公寓2011)

[{: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中提供的功能,但我需要匹配鍵以查看它們是否存在,如果它們不存在,則填零。

我希望我正確地描述這個,再次感謝你們!舉手擊掌!

回答

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

這是我會怎麼做,只要有不是一個巨大的項目數:

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是巨大的,你可能要轉換它將首先將日期映射到其數據。

+0

萬一有人需要它:要將其轉換爲日期映射到他們的數據的哈希,你可以只是做'tracks_by_day.group_by {|軌道|軌道[:日期]}'。 – Chuck 2011-04-05 00:32:16

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