Ruby on rails 处理数组内的散列

Ruby on rails 处理数组内的散列,ruby-on-rails,arrays,hash,iteration,Ruby On Rails,Arrays,Hash,Iteration,有更好的方法吗? 我有两个哈希数组,我想得到一个日期重叠的哈希数组,版本设置为交叉点(即version1_表示_arr1和version1_表示_arr2) arr1是 [{:day=>day1, :version1=>true, :version2=>false, :version3=>true}, {:day=>day3, :version1=>false, :version2=>false, :version3=>true}, {:day

有更好的方法吗? 我有两个哈希数组,我想得到一个日期重叠的哈希数组,版本设置为交叉点(即version1_表示_arr1和version1_表示_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
days=[]
arr1.每个do | d1|
arr2.每个do | d2|
如果d1[:天]==d2[:天]
天数(d1[:version1]&&d2[:version1],:version2=>(d1[:version2]&&d2[:version2],:version3=>(d1[:version3]&&d2[:version3])
结束
结束
结束
然而,当它被扩展并且数组变得非常大时,它似乎非常昂贵。它迭代了n^n次

我确实在rassoc和assoc上看到了这一点,但看起来它们需要是数组中的数组,我后来将得到的哈希用作哈希


有更好的方法吗?我不断提出其他想法,但当我真正研究它们时,它们都返回到两个嵌套的迭代中。

这两个哈希数组是从哪里获得的?如果您将搜索词存储在SQL数据库中,这似乎是您可以使用查询来完成的

否则,您可能会考虑使用集合来查找日期的交点

require 'set'

def daylist(arr)
  arr.map { |a| a[:day] }
end

set1 = Set.new(daylist(arr1))
set2 = Set.new(daylist(arr2))

days = set1.intersection(set2)

result = ....
我在这里停下来是因为当我进一步查看您的数据时,我想知道您是否可以重新构造它。我觉得如果您不使用散列数组,而是使用散列数组,则转换起来可能会更容易:

require 'set'

h1 = {
  day1: [ true, false, true ],
  day3: [ false, false, true ],
  day4: [ true, false, false ],
  day5: [ true, true, true ],
  day10: [ true, true, true ],
  day15: [ true, false, false ]
}

h2 = {
  day1: [ false, false, true ],
  day2: [ false, false, true ],
  day4: [ true, true, false ],
  day5: [ false, true, true ],
  day15: [ true, false, false ]
}

# Intersect them.
set1 = Set.new(h1.keys)
set2 = Set.new(h2.keys)
intersection = set1.intersection(set2)

# Compute the lval & rval arrays
anded = intersection.map do |day|
  h1[day].each_with_index.map { |x, i| x && h2[day][i] }
end

# Convert them back into a Hash like our originals
final = Hash[intersection.zip(anded)]

当然,如果这些数据来自Postgres或其他什么东西,那么你最好在查询中尝试这样做。在这种情况下,我刚才写的所有内容对你来说都是无用的。

你能解释一下这些数据是什么吗?每个散列和每个数组都有明显的模式,这意味着你可以(而且可能应该)这样做将它们转换为类。每个数组表示一个搜索词的出现次数(我们允许人们搜索最多两个词),每个哈希值是该搜索词出现次数所属的day对象,并且可能包含在多个版本(标准和/或多个其他选项)中,也可能不包含在其中我不知道将它们作为类(或者它们在rails中的位置)会如何工作这只是搜索算法的一小部分。我正在尝试获取两个搜索词相交的每天的日期和版本。数据的重组效果很好。我不知道你可以将这些日期本身用作哈希键。