【问题标题】:sum all values of a multidimensional array via month通过月份对多维数组的所有值求和
【发布时间】:2018-06-21 19:37:47
【问题描述】:

我有以下数据,我想通过他们的月份总结所有 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},
   ]

【问题讨论】:

    标签: ruby-on-rails sinatra


    【解决方案1】:

    您似乎不需要这种冗长的数据格式。您只需 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}
    

    【讨论】:

    • 感谢您的快速回复。有没有学习 ruby​​ / sinatra 的好资源?
    • @CuriousDeveloper 这取决于您喜欢哪种学习方式(书籍、播客、博客、课程等)。
    • 我更喜欢通过博客或任何学习网站(免费资源)学习。
    • Hash.new(0) 在这里就足够了,对吧?可能会使其他人更容易访问该代码。 (顺便说一句,不错的答案,+1。)
    【解决方案2】:

    您可以在group_bysum 值的帮助下按month 对数据进行分组

    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}]
    

    【讨论】:

      【解决方案3】:

      当我自己尝试时。我能够以某种方式做到这一点。我不确定这是否是最好的方法,但它确实有效。在这里,我还添加了空月份,例如我上面的示例有 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},
         ]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-02-13
        • 1970-01-01
        • 2019-07-19
        • 1970-01-01
        • 2015-10-30
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多