Ruby on rails 按数组和sum变量分组以查看最高值

Ruby on rails 按数组和sum变量分组以查看最高值,ruby-on-rails,arrays,ruby,Ruby On Rails,Arrays,Ruby,以以下数组为例: array = [{"filial"=>"01", "tipo_produto"=>"MR", "total"=>"1492.03"}, {"filial"=>"01", "tipo_produto"=>"MR", "total"=>"1492.03"}, {"filial"=>"01", "tipo_produto"=>"PA", "total"=>"1492.03"},

以以下数组为例:

array = [{"filial"=>"01", "tipo_produto"=>"MR", "total"=>"1492.03"},
         {"filial"=>"01", "tipo_produto"=>"MR", "total"=>"1492.03"},
         {"filial"=>"01", "tipo_produto"=>"PA", "total"=>"1492.03"},
         {"filial"=>"01", "tipo_produto"=>"PA", "total"=>"1492.03"}]
我需要按“tipo_produto”进行分组,然后对每组的“总数”求和,看看哪一组的总和最高。最后,我需要知道哪一组得分最高。以下是我到目前为止的情况:

array2 = array.group_by { |d| d["tipo_produto"] }
这导致了以下对象:

array2 = {"MR"=>[{"filial"=>"01", "tipo_produto"=>"MR", "total"=>"1492.03"}, 
                 {"filial"=>"01", "tipo_produto"=>"MR", "total"=>"1492.03"}], 
          "PA"=>[{"filial"=>"01", "tipo_produto"=>"PA", "total"=>"1492.03"}, 
                 {"filial"=>"01", "tipo_produto"=>"PA", "total"=>"1492.03"}]}
接下来的步骤是什么?谢谢。

可能的解决方案:

# your first step
grouped_values = array.group_by {|d| d["tipo_produto"]}
# aggregate by total:
grouped_values.each do |k, v|
  grouped_values[k] = v.inject(0) {|r, i| r + i['total'].to_f }
end
=> {"MR"=>2984.06, "PA"=>2984.06}
# find the highest:
grouped_values.max_by {|_, v| v}
=> ["MR", 2984.06]
可能的解决办法:

# your first step
grouped_values = array.group_by {|d| d["tipo_produto"]}
# aggregate by total:
grouped_values.each do |k, v|
  grouped_values[k] = v.inject(0) {|r, i| r + i['total'].to_f }
end
=> {"MR"=>2984.06, "PA"=>2984.06}
# find the highest:
grouped_values.max_by {|_, v| v}
=> ["MR", 2984.06]

您可以在group_by和map之后使用max_by:

array = [{ 'filial' => '01', 'tipo_produto' => 'MR', 'total' => '1492.03' },
         { 'filial' => '01', 'tipo_produto' => 'MR', 'total' => '1492.03' },
         { 'filial' => '01', 'tipo_produto' => 'PA', 'total' => '1492.03' },
         { 'filial' => '01', 'tipo_produto' => 'PA', 'total' => '1492.05' }]

array2 = array.group_by { |d| d['tipo_produto'] }

types_and_totals = array2.map { |type, products|
  [
    type,
    products.map { |product| product['total'].to_f }.inject(&:+)
  ]
}

p types_and_totals.max_by { |_, total| total }
#=> ["PA", 2984.08]

它只输出最高总和的
tipo\u produto
total

您可以在group\u by和map之后使用max\u by:

array = [{ 'filial' => '01', 'tipo_produto' => 'MR', 'total' => '1492.03' },
         { 'filial' => '01', 'tipo_produto' => 'MR', 'total' => '1492.03' },
         { 'filial' => '01', 'tipo_produto' => 'PA', 'total' => '1492.03' },
         { 'filial' => '01', 'tipo_produto' => 'PA', 'total' => '1492.05' }]

array2 = array.group_by { |d| d['tipo_produto'] }

types_and_totals = array2.map { |type, products|
  [
    type,
    products.map { |product| product['total'].to_f }.inject(&:+)
  ]
}

p types_and_totals.max_by { |_, total| total }
#=> ["PA", 2984.08]

它只输出最高总和的
tipo\u produto
total

您期望的答案是什么?您想得到什么结果?你能给我举个例子吗?任何能告诉我最高的“tipo_produto”是多少的结果。例如,可以是一个带“MR”的简单字符串,也可以是数组中的第一项……您期望的答案是什么?您的意思是什么?您希望得到什么结果?你能给我举个例子吗?任何能告诉我最高的“tipo_produto”是多少的结果。例如,可以是一个带有“MR”的简单字符串,也可以只是group by数组中的第一项……您的解决方案帮助我通过了,我只需在代码中再添加一行就可以得到我想要的内容,如果您想在您的答案中进行编辑,我就可以接受它:分组的_值。按{k,v |-v}对_进行排序。首先,结果是[“PA”,3500.0]…@GustavoGabriel你可以使用
max_by
:)你的解决方案帮助我通过了,我只需要在我的代码中再添加一行就可以得到我想要的,如果你想在你的答案中进行编辑,我就可以接受它:分组的_值。按{k,v |-v}排序。首先,结果是[“PA”,3500.0]。@GustavoGabriel你可以使用
max_by
:)