2

一个名为 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}
]

我需要按日期将日志折叠成一个包含每天一个条目的哈希数组:

result = [
  {time: 201201, x: 2, y: 7, z: 2},
  {time: 201202, a: 3, b: 4, c: 0},
]
4

4 回答 4

5
log.group_by {|e| e[:time] }.map {|_,v| v.reduce(:merge) }
于 2013-05-16T02:46:04.060 回答
2

关于什么

log.each_with_object({}) do |e, a|
  (a[e[:time]] ||= {}).merge!(e)
end.values
于 2013-05-16T02:47:08.833 回答
0

我解决了这个问题,但我对这个解决方案不满意。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
于 2013-05-16T02:24:46.760 回答
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}
于 2014-10-28T16:45:38.977 回答