如何对 json 数组进行分组并每周汇总其总数?

Posted

技术标签:

【中文标题】如何对 json 数组进行分组并每周汇总其总数?【英文标题】:How to group json array and sum its total per week? 【发布时间】:2021-12-29 02:17:18 【问题描述】:

我有一个数组

    [
        
            "week_year": "49-2021",
            "total": 6.5
        ,
        
            "week_year": "45-2021",
            "total": 28.5
        ,
        
            "week_year": "45-2021",
            "total": 6.5
        ,
        
            "week_year": "44-2021",
            "total": 6.5
        ,
        
            "week_year": "46-2021",
            "total": 14.5
        
    ]

我想按相同的 week_year 对它进行分组并总结每周的总数。还有其他方法吗?

【问题讨论】:

【参考方案1】:

如果需要的输出类似于 week_year => total ,那么您可以使用group_bytransform_valuessum 的组合:

arr
  .group_by  |hash| hash[:week_year] 
  .transform_values  |arr| arr.sum  |hash| hash[:total]  
# "49-2021"=>6.5, "45-2021"=>35.0, "44-2021"=>6.5, "46-2021"=>14.5

【讨论】:

我晚了 4 秒 :D 聚会永远不会太晚【参考方案2】:

如果arr 是问题中给出的数组,人们可以写

arr.each_with_object(Hash.new(0))  |g,h| h[g[:week_year]] += g[:total] 
  #=> "49-2021"=>6.5, "45-2021"=>35.0, "44-2021"=>6.5, "46-2021"=>14.5

与使用Enumerable#group_by 相比,这将通过数组进行一次传递,并且需要更少的内存。可以说,它读起来也更好。是否更快是一个悬而未决的问题。

这采用Hash::new 的形式,它接受一个参数——称为默认值——并且没有块。如果哈希h 是这样定义的,那么可能在添加键之后,如果h 没有键kh[k] 返回默认值。默认值通常选择为零,就像这里一样。

表达式

h[g[:week_year]] += g[:total]

扩展到

h[g[:week_year]] = h[g[:week_year]] + g[:total]

所以如果h 没有密钥g[:week_year] 这变成了

h[g[:week_year]] = 0 + g[:total]

【讨论】:

【参考方案3】:

您可以将group_by 与transform_values 结合使用:

array.group_by  |a| a[:week_year] 
     .transform_values  |values| values.sum  |value| value[:total]  

哪个会返回:


 "49-2021" => 6.5,
 "45-2021" => 35.0,
 "44-2021" => 6.5,
 "46-2021" => 14.5

【讨论】:

以上是关于如何对 json 数组进行分组并每周汇总其总数?的主要内容,如果未能解决你的问题,请参考以下文章

如何将日期分组为周?

猫鼬日期比较没有时间和按createdAt和staffId分组,每周、每月和每年按聚合计算的员工总数?

如何显示每周发生并满足某些条件的记录总数 SQL

按 JSON 数组对 SQL 数据进行分组

如何根据相同的值对数组进行分组

Eloquent 按碳日期周数对数组进行分组