A local variable named log contains an array of hashes with timestamped events like so:
一个名为log的本地变量包含一组具有时间戳事件的散列,如下所示:
log = [
{time: 201201, x: 2},
{time: 201201, y: 7},
{time: 201201, z: 2},
{time: 201202, a: 3},
{time: 201202, b: 4},
{time: 201202, c: 0}
]
I need to collapse the log by date into an array of hashes containing one entry per day:
我需要将日志按日期折叠成一个散列数组,其中每天包含一个条目:
result = [
{time: 201201, x: 2, y: 7, z: 2},
{time: 201202, a: 3, b: 4, c: 0},
]
4 个解决方案
#1
5
log.group_by {|e| e[:time] }.map {|_,v| v.reduce(:merge) }
#2
2
What about
是什么
log.each_with_object({}) do |e, a|
(a[e[:time]] ||= {}).merge!(e)
end.values
#3
0
I resolved the problem but I'm not happy with this solution. Seems to be useful the group_by method for this kind of problem.
我解决了这个问题,但我对这个解决方案不满意。似乎用group_by方法来解决这类问题似乎很有用。
log.inject([]) do |acc, elem|
time = elem[:time]
found_by_time = acc.select {|hash| hash.any? {|i| i.include?(time)}}
found_by_time.empty? ? acc << elem : found_by_time.first.merge!(elem)
acc
end
#4
0
log = [
{time: 201201, x: 2},
{time: 201201, y: 7},
{time: 201201, z: 2},
{time: 201202, a: 3},
{time: 201202, b: 4},
{time: 201202, c: 0}
]
answer = log.reduce([]) do |result, value|
d = result.select {|h| h.any? {|i| i.include?(value[:time])}}
if d.empty?
result << value
else
d.first.merge!(value)
end
result
end
#=>{:time=>201201, :x=>2, :y=>7, :z=>2}
#=>{:time=>201202, :a=>3, :b=>4, :c=>0}
#1
5
log.group_by {|e| e[:time] }.map {|_,v| v.reduce(:merge) }
#2
2
What about
是什么
log.each_with_object({}) do |e, a|
(a[e[:time]] ||= {}).merge!(e)
end.values
#3
0
I resolved the problem but I'm not happy with this solution. Seems to be useful the group_by method for this kind of problem.
我解决了这个问题,但我对这个解决方案不满意。似乎用group_by方法来解决这类问题似乎很有用。
log.inject([]) do |acc, elem|
time = elem[:time]
found_by_time = acc.select {|hash| hash.any? {|i| i.include?(time)}}
found_by_time.empty? ? acc << elem : found_by_time.first.merge!(elem)
acc
end
#4
0
log = [
{time: 201201, x: 2},
{time: 201201, y: 7},
{time: 201201, z: 2},
{time: 201202, a: 3},
{time: 201202, b: 4},
{time: 201202, c: 0}
]
answer = log.reduce([]) do |result, value|
d = result.select {|h| h.any? {|i| i.include?(value[:time])}}
if d.empty?
result << value
else
d.first.merge!(value)
end
result
end
#=>{:time=>201201, :x=>2, :y=>7, :z=>2}
#=>{:time=>201202, :a=>3, :b=>4, :c=>0}