我有一个跟随结构的哈希:
{
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循环那将是很好的.
先感谢您.
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)
| 归档时间: |
|
| 查看次数: |
68 次 |
| 最近记录: |