按日期将日志折叠成一个散列数组

时间:2021-04-02 07:36:22

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}