You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby技术问题:按日期/周合并哈希数组、数组的数组并求和

没问题,这两个场景我平时写Ruby代码也经常碰到,给你整理了实用的解决方案:

问题1:合并哈希数组,按日期对总计值求和

假设你有这样的哈希数组,每个哈希包含日期和对应的值:

orders = [
  { date: "2024-05-01", total: 120 },
  { date: "2024-05-01", total: 80 },
  { date: "2024-05-02", total: 150 },
  { date: "2024-05-03", total: 90 },
  { date: "2024-05-02", total: 70 }
]

最简洁的方式是用group_by按日期分组,然后对每组的total求和:

merged_orders = orders.group_by { |item| item[:date] }.map do |date, items|
  { date: date, total: items.sum { |item| item[:total] } }
end

# 输出结果
# => [{:date=>"2024-05-01", :total=>200}, {:date=>"2024-05-02", :total=>220}, {:date=>"2024-05-03", :total=>90}]

如果处理大数据量想更高效,可以用each_with_object直接累加,避免中间分组的额外内存开销:

merged_orders = orders.each_with_object({}) do |item, result|
  date = item[:date]
  result[date] ||= 0
  result[date] += item[:total]
end.map { |date, total| { date: date, total: total } }

两种方式都能得到按日期合并后的总计结果,按需选择就行。

问题2:合并数组的数组,计算每周订单总数

假设你的数组结构是这样的,每个子数组第一个元素是周标识(比如202418代表2024年第18周),第二个是当周的订单数:

weekly_orders = [
  [202418, 15],
  [202418, 10],
  [202419, 22],
  [202418, 8],
  [202419, 18]
]

同样可以用两种常用方式处理:

方法1:group_by + sum

total_weekly = weekly_orders.group_by { |item| item[0] }.map do |week, orders|
  [week, orders.sum { |order| order[1] }]
end

# 输出结果
# => [[202418, 33], [202419, 40]]

方法2:each_with_object 累加

total_weekly = weekly_orders.each_with_object({}) do |(week, count), result|
  result[week] ||= 0
  result[week] += count
end.to_a

如果需要最终结果是哈希而不是数组,直接去掉最后的to_a就行:

# 得到哈希格式:{202418=>33, 202419=>40}
total_weekly_hash = weekly_orders.each_with_object({}) do |(week, count), result|
  result[week] ||= 0
  result[week] += count
end

这样就能轻松合并同周的订单数,得到每周的总数啦。

内容的提问来源于stack exchange,提问作者Simmo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:14:52