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}
]

日付ごとにログを折りたたんで、1 日に 1 つのエントリを含むハッシュの配列にする必要があります。

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 に答える