通过月份对多维数组的所有值求和

时间:2018-06-21 07:20:24

标签: ruby-on-rails sinatra

我有以下数据,我想通过它们的月份求和所有data值。

   [
    {"month":"Apr", "data": 1},
    {"month":"Apr", "data": 9},
    {"month":"May", "data": 2},
    {"month":"May", "data": 10},
    {"month":"May", "data": 2},
    {"month":"June", "data": 1},
   ]

这样输出应该像这样

 [
    {"month":"Apr", "data": 10},
    {"month":"May", "data": 14},
    {"month":"June", "data": 1},
   ]

3 个答案:

答案 0 :(得分:2)

似乎您不需要这种冗长的数据格式。您只需进行1次迭代即可完成

data.each_with_object(Hash.new { |h, v| h[v] = 0 }) do |elem, memo|
  memo[elem[:month]] += elem[:data] 
end
#=> {"Apr"=>10, "May"=>14, "June"=>1}

答案 1 :(得分:1)

您可以在monthgroup_by值的帮助下,按sum将数据分组

data = [
  {"month":"Apr",  "data": 1},
  {"month":"Apr",  "data": 9},
  {"month":"May",  "data": 2},
  {"month":"May",  "data": 10},
  {"month":"May",  "data": 2},
  {"month":"June", "data": 1}
]

data.group_by{ |h| h[:month] }.map{ |k, v| { month: k, data: v.sum{ |h| h[:data] }}}

#=> [{:month=>"Apr", :data=>10},
#=> {:month=>"May", :data=>14},
#=> {:month=>"June", :data=>1}]

答案 2 :(得分:0)

虽然我自己尝试过。我能够以某种方式做到这一点。我不确定这是否是最好的方法,但是它确实有效。在这里,我还添加了空的月份,例如,上面的示例中有4月,5月,6月的月份,我还需要其余的几个月,所以这是我的代码。  这里的arr是示例中上述数据库中的实际数组,并且month_list包含从JanDec

的月份列表。

arr包含这样的值

 [
         {"Month":"Apr", "data": 1},
        {"month":"Apr", "data": 9},
        {"month":"May", "data": 2},
        {"month":"May", "data": 10},
        {"month":"May", "data": 2},
        {"month":"June", "data": 1},
       ]

month_list包含这样的空值

[
    {"month":"Jan", "data": 0},
    {"month":"Feb", "data": 0},
    {"month":"Mar", "data": 0},
    {"month":"Apr", "data": 0},
    {"month":"May", "data": 0},
    {"month":"Jun", "data": 0},
    {"month":"Jul", "data": 0},
    {"month":"Aug", "data": 0},
    {"month":"Sep", "data": 0},
    {"month":"Oct", "data": 0},
    {"month":"Nov", "data": 0},
    {"month":"Dec", "data": 0},
   ]

以下函数将合并两个数组并每月汇总所有数据

  def self.add_values_via_date(arr, month_list)
    a = []
    # create empty data
    month_list.each do |data|
      a << {:month=> data, :data=>0}
    end
    #sum all months data
    a.each do |data|
      arr.each do |value|
        if data[:month] == value[:month]
          data[:data] += value[:data]
        end
      end
    end
    return a
  end

并给我这样的输出

[
    {"month":"Jan", "data": 0},
    {"month":"Feb", "data": 0},
    {"month":"Mar", "data": 0},
    {"month":"Apr", "data": 10},
    {"month":"May", "data": 14},
    {"month":"Jun", "data": 1},
    {"month":"Jul", "data": 0},
    {"month":"Aug", "data": 0},
    {"month":"Sep", "data": 0},
    {"month":"Oct", "data": 0},
    {"month":"Nov", "data": 0},
    {"month":"Dec", "data": 0},
   ]