Ruby - How to retrieve sum in array group by multiple keys with condition max

后端 未结 3 1581
暗喜
暗喜 2021-01-22 15:51

The original array is

[
    {\"id\"=>2, \"idx\"=>111, \"money\"=>\"4.00\", \"money1\"=>\"1.00\", \"order\"=>\"001\", \"order1\"=>\"1\"},
    {\         


        
3条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2021-01-22 16:29

    This should be pretty close of what you asked

    def f_addition(arr, group_fields, sum_fields, max_fields)
      arr.group_by do |h|
        group_fields.map {|k| h[k]}
      end.values.map do |group|
        sums = group.each_with_object(Hash.new(0)) do |h, acc|
          sum_fields.each {|sum_f| acc[sum_f] += h[sum_f].to_f }
        end
        group.first.merge(sums)
      end.flatten
    end
    
    arr = [
        {"id"=>2, "idx"=>111, "money"=>"4.00", "money1"=>"1.00", "order"=>"001", "order1"=>"1"},
        {"id"=>1, "idx"=>112, "money"=>"2.00", "money1"=>"2.00", "order"=>"001", "order1"=>"1"},
        {"id"=>3, "idx"=>113, "money"=>"3.00", "money1"=>"1.00", "order"=>"002", "order1"=>"2"}
    ]
    
    
    f_addition(arr, ["order","order1"], ["money","money1"], ["id", "idx"] )
    
    # [
    #   {"id"=>2, "idx"=>111, "money"=>6.0, "money1"=>3.0, "order"=>"001", "order1"=>"1"}
    #   {"id"=>3, "idx"=>113, "money"=>3.0, "money1"=>1.0, "order"=>"002", "order1"=>"2"}
    # ]
    

提交回复
热议问题