在Ruby数组中合并和求和

时间:2018-02-19 15:04:14

标签: arrays ruby hash merge sum

我有一个看起来像这样的Ruby数组:

[{ :date => '2018-02-01', :capacity => 5, :used_capacity => 3 },
 { :date => '2018-02-01', :capacity => 10, :used_capacity => 3 },
 { :date => '2018-02-02', :capacity => 5, :used_capacity => 3 }]

如果它们具有相同的日期并且总计容量和used_capacity字段,那么我需要哈希值。

所以它需要成为:

[{ :date => '2018-02-01', :capacity => 15, :used_capacity => 6 },
 { :date => '2018-02-02', :capacity => 5, :used_capacity => 3 }]

有人能把我推向正确的方向吗?

日Thnx!

2 个答案:

答案 0 :(得分:2)

input = [{ :date => '2018-02-01', :capacity => 5, :used_capacity => 3 },
         { :date => '2018-02-01', :capacity => 10, :used_capacity => 3 },
         { :date => '2018-02-02', :capacity => 5, :used_capacity => 3 }]

input.group_by { |h| h[:date] }.
      values.
      map do |a|
        a.reduce do |acc, h|
          acc.merge(h) { |k, v1, v2| k == :date ? v1 : v1 + v2 }
        end
      end

答案 1 :(得分:0)

arr = [{ :date => '2018-02-01', :capacity => 5, :used_capacity => 3 },
 { :date => '2018-02-01', :capacity => 10, :used_capacity => 3 },
 { :date => '2018-02-02', :capacity => 5, :used_capacity => 3 }]

arr.each_with_object({}) do |g,h|
  h.update(g[:date]=>g) do |_,oh,nh|
    oh.merge(nh) { |k,ov,nv| k==:date ? ov : ov+nv }
  end
end.values
  #=> [{:date=>"2018-02-01", :capacity=>15, :used_capacity=>6},
  #    {:date=>"2018-02-02", :capacity=>5, :used_capacity=>3}]

这使用Hash#update(aka merge!)和Hash#merge的形式,它们使用块来确定合并的两个哈希中存在的键的值。 update