我有一个看起来像这样的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!
答案 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
。