Ruby on rails Rails合并两个哈希数组?

Ruby on rails Rails合并两个哈希数组?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我很难理解合并两个散列数组所需的逻辑,似乎我以不同的方式问了t,我还尝试了其他一些事情,比如这里提供的答案: 理解这一点的任何帮助都会对我很有帮助 假设我有以下数组,这是从方法本身输出的,所以你可以想象那些:timestamps是Time对象 [ {:timestamp=>2011-12-19 00:00:00 UTC}, {:timestamp=>2011-12-19 01:00:00 UTC}, {:timestamp=>2011-12-19 02:00:00

我很难理解合并两个散列数组所需的逻辑,似乎我以不同的方式问了t,我还尝试了其他一些事情,比如这里提供的答案:

理解这一点的任何帮助都会对我很有帮助

假设我有以下数组,这是从方法本身输出的,所以你可以想象那些
:timestamp
s是
Time
对象

[
  {:timestamp=>2011-12-19 00:00:00 UTC},
  {:timestamp=>2011-12-19 01:00:00 UTC},
  {:timestamp=>2011-12-19 02:00:00 UTC},
  {:timestamp=>2011-12-19 03:00:00 UTC},
  {:timestamp=>2011-12-19 04:00:00 UTC},
  {:timestamp=>2011-12-19 05:00:00 UTC}
]
然后是一个像这样的附加数组,每个数组都有另一个值(但有时除了
:count
,可能还有更多的值)

结果是这样的:

[
  {:timestamp=>2011-12-19 00:00:00 UTC},
  {:timestamp=>2011-12-19 01:00:00 UTC},
  {:timestamp=>2011-12-19 02:00:00 UTC, :count=>5},
  {:timestamp=>2011-12-19 03:00:00 UTC},
  {:timestamp=>2011-12-19 04:00:00 UTC, :count=>21},
  {:timestamp=>2011-12-19 05:00:00 UTC}
]
再次感谢您的帮助,我不知道为什么我不能找到适合这个的设计模式。

a=[
a = [
  {:timestamp=>'2011-12-19 00:00:00 UTC'},
  {:timestamp=>'2011-12-19 01:00:00 UTC'},
  {:timestamp=>'2011-12-19 02:00:00 UTC'},
  {:timestamp=>'2011-12-19 03:00:00 UTC'},
  {:timestamp=>'2011-12-19 04:00:00 UTC'},
  {:timestamp=>'2011-12-19 05:00:00 UTC'}
]

b = [
  {:timestamp=>'2011-12-19 02:00:00 UTC', :count=>5},
  {:timestamp=>'2011-12-19 04:00:00 UTC', :count=>21}
]

result = a.inject([]) do |memo, v|
  if match = b.detect { |w| (w.to_a & v.to_a).any? }
    memo << match.merge(v)
  else
    memo << v
  end
end

p result
{:时间戳=>'2011-12-19 00:00:00 UTC'}, {:时间戳=>'2011-12-19 01:00:00 UTC'}, {:时间戳=>'2011-12-19 02:00:00 UTC'}, {:时间戳=>'2011-12-19 03:00:00 UTC'}, {:时间戳=>'2011-12-19 04:00:00 UTC'}, {:时间戳=>'2011-12-19 05:00:00 UTC'} ] b=[ {:timestamp=>'2011-12-19 02:00:00 UTC',:count=>5}, {:时间戳=>'2011-12-19 04:00:00 UTC',:计数=>21} ] 结果=a.注入([])do |备忘录,v| 如果match=b.detect{| w |(w.to_a&v.to_a).any?}
备注看起来您首先按时间戳分组,然后合并值:

(a1+a2).group_by{|h| h[:timestamp]}.map{|k,v| v.reduce(:merge)}

由于您使用每个散列的
:timestamp
属性作为其“键”,因此如果您实际使用
:timestamp
属性作为键将数组转换为散列,则很容易:

h1 = Hash[a1.map{|h| [h[:timestamp], h]}]
h2 = Hash[a2.map{|h| [h[:timestamp], h]}]
然后,您需要的是简单地将两个哈希值进行
合并
(并删除添加的键):


对于较短的代码,您可以删除最后一个块上的
&
:v.reduce(:merge)
h1 = Hash[a1.map{|h| [h[:timestamp], h]}]
h2 = Hash[a2.map{|h| [h[:timestamp], h]}]
p h1.merge(h2).values
# => [
#  {:timestamp=>"2011-12-19 00:00:00 UTC"},
#  {:timestamp=>"2011-12-19 01:00:00 UTC"},
#  {:timestamp=>"2011-12-19 02:00:00 UTC", :count=>5},
#  {:timestamp=>"2011-12-19 03:00:00 UTC"},
#  {:timestamp=>"2011-12-19 04:00:00 UTC", :count=>21},
#  {:timestamp=>"2011-12-19 05:00:00 UTC"}
#]