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

如何在Ruby中计算分组哈希数组的平均加载时间

解决按Path分组计算平均加载时间的问题

嘿,我来帮你捋捋代码里的问题,以及怎么修正它~

首先,你的代码有几个关键问题导致跑不起来:

  • 首先得明确grouped_data的结构:如果它是用group_by { |h| h["path"] }得到的分组结果,那它是一个哈希,结构是{ "/abcd.com" => [哈希1, 哈希2, 哈希3] },所以each遍历的时候,每个元素是「路径字符串 + 对应哈希数组」的键值对,而不是你写的直接遍历array。
  • 你在内部对单个hash调用hash["time"].reduce,但hash["time"]是单个数值(比如0.503),reduce是数组的方法,单个数值根本没有这个方法,这肯定会报错。
  • Ruby里除法不能直接用空格隔开,得用/运算符,虽然你的时间是浮点数,但最好显式处理类型避免意外。

接下来给你几种实用的正确写法:

情况1:从原始数据开始分组计算

如果你的原始数据还没分组,先分组再算平均最直接:

# 你的示例原始数据
raw_data = [
  {"path"=>"/abcd.com", "time"=>0.503},
  {"path"=>"/abcd.com", "time"=>0.765},
  {"path"=>"/abcd.com", "time"=>0.553}
]

# 先按path分组,再计算每个组的平均时间
path_averages = raw_data.group_by { |item| item["path"] }.transform_values do |group_items|
  total_time = group_items.sum { |item| item["time"] }
  total_time / group_items.length.to_f # 转成float确保结果是小数
end

# 输出结果是:{"/abcd.com"=>0.607}

这里group_by负责把相同path的哈希归为一组,transform_values则遍历每个组,计算时间总和再除以元素个数,最后返回一个「路径:平均时间」的哈希。

情况2:如果grouped_data已经是分组好的数组集合

要是你已经把数据分成了类似[[哈希1,哈希2,哈希3], ...]的数组集合,那可以这样写:

averages = grouped_data.map do |group|
  total_time = group.sum { |item| item["time"] }
  # 返回包含路径和平均时间的哈希
  { path: group.first["path"], average_load_time: total_time / group.length.to_f }
end

这样得到的结果是一个数组,每个元素是包含路径和对应平均时间的哈希。

你的原代码修改版

如果硬要基于你原来的代码逻辑修改,应该改成这样(假设grouped_data是分组后的哈希):

averages = {}
grouped_data.each do |path, items|
  # 用reduce累加所有time,初始值设为0.0确保是浮点数运算
  total_time = items.reduce(0.0) { |sum, item| sum + item["time"] }
  averages[path] = total_time / items.length
end

用你的示例数据测试的话,最终平均时间是0.607,完全符合预期~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:09:06