これを行うより良い方法はありますか?ハッシュの配列が 2 つあり、日付が重複するハッシュの配列を取得したいと考えています。バージョンは共通部分 (つまり、version1_for_arr1 && version1_for_arr2) に設定されています。
arr1は
[{:day=>day1, :version1=>true, :version2=>false, :version3=>true},
{:day=>day3, :version1=>false, :version2=>false, :version3=>true},
{:day=>day4, :version1=>true, :version2=>false, :version3=>false},
{:day=>day5, :version1=>true, :version2=>true, :version3=>true},
{:day=>day10, :version1=>true, :version2=>true, :version3=>true},
{:day=>day15, :version1=>true, :version2=>false, :version3=>false}]
arr2は
[{:day=>day1, :version1=>false, :version2=>false, :version3=>true},
{:day=>day2, :version1=>false, :version2=>false, :version3=>true},
{:day=>day4, :version1=>true, :version2=>true, :version3=>false},
{:day=>day5, :version1=>false, :version2=>true, :version3=>true},
{:day=>day15, :version1=>true, :version2=>false, :version3=>false}]
この場合、最終的な配列は次のようになります。
[{:day=>day1, :version1=>false, :version2=>false, :version3=>true},
{:day=>day4, :version1=>true, :version2=>false, :version3=>false},
{:day=>day5, :version1=>false, :version2=>true, :version3=>true},
{:day=>day15, :version1=>true, :version2=>false, :version3=>false}]
これを行うと考えることができる唯一の方法は、ネストされた反復としてです。
days=[]
arr1.each do |d1|
arr2.each do |d2|
if d1[:day]==d2[:day]
days<<Hash.new(:day=>d1, :version1=>(d1[:version1]&&d2[:version1], :version2=>(d1[:version2]&&d2[:version2], :version3=>(d1[:version3]&&d2[:version3])
end
end
end
ただし、スケーリングされて配列が非常に大きくなると、非常にコストがかかるようです。n^n回繰り返しています。
http://rosettacode.org/wiki/Loop_over_multiple_arrays_simultaneously#Ruby on rassoc と assoc を見ましたが、それらは配列内の配列である必要があるようで、後で結果のハッシュをハッシュとして使用します。
これを行うより良い方法はありますか?私は他のアイデアを思いつき続けていますが、実際にそれらを調べてみると、それらはすべて 2 つのネストされたイテレーションに戻ってきます。