有一个更好的方法吗?我有两个哈希数组,我想得到一个哈希数组,其中日期重叠,版本设置为交集(即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,但看起来它们需要是数组内部的数组,我后来使用生成的哈希作为哈希。
有一个更好的方法吗?我不断提出其他想法,但当我真正检查它们时,它们都会回到两个嵌套迭代。