Ruby合并n Hash Elements并取中键

Dok*_*ldo 1 ruby hash merge

我有一个跟随结构的哈希:

{
  timestamp1 => { attr1 => 1, attri2 => 2, attr3 => 3},
  timestamp2 => { attr1 => 1, attri2 => 2, attr3 => 3},
  timestamp3 => { attr1 => 1, attri2 => 2, attr3 => 3},
  ...
}
Run Code Online (Sandbox Code Playgroud)

我所做的是将n个元素加在一起,并采用中间时间戳.所以例如在这种情况下,如果将3天合并在一起我想要这样的结果:

{
  timestamp2 => {attr1 => 3. attr2 => 6, attr3 => 9}
  timestamp5 => ... # Here the next summed values
  ...
}
Run Code Online (Sandbox Code Playgroud)

我现在已经准备好它并且它正在工作,但是代码不是很好,它只是合并第一个和最后一个元素,直到只留下中间的一个:

hash.each_slice(n) do |part|
  iterator = 0

  while(part.length > 1) do
   hash_a = part.first.last
   hash_b = part.last.last

   new_values = hash_a.merge(hash_b){ | key, oldval, newval| (newval + oldval)

   if iteration % 2 == 0
     part[0][1] = new_values
     part.delete_at(part.count-1)
   else 
     part.delete_at(0)
     part[part.count-1][1] = new_values
   end
   iteration += 1
 end
Run Code Online (Sandbox Code Playgroud)

注意:我知道这段代码并不漂亮,但你不必纠正这个,它只是一个例子,而不是我的实际代码.

现在我想知道什么.有没有更好的方法来实现这一点与减少,选择,group_by或合并.如果我可以摆脱while循环那将是很好的.

先感谢您.

Ale*_*kin 5

N = 3

hash.each_slice(N).map do |part|
  [part[part.size / 2].first, part.each_with_object({}) do |(_, v), acc|
    acc.merge!(v) { |_, v1, v2| v1 + v2 }
  end]
end.to_h
Run Code Online (Sandbox Code Playgroud)