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

Ruby:按对应键汇总哈希数组的值

Ruby 哈希数组按键求和的实现方法

嘿,这个需求在日常开发里挺常见的,我给你分享几种Ruby里的实现方式,都能轻松得到你想要的结果~

方法一:用 each_with_object 遍历累加

这种方式逻辑直观,容易理解,适合新手或者需要清晰展示过程的场景:

arr = [{a: 1, b: 2, c:3}, {a:2, b:10, c:2}, {a:9, b:2, c:8}]

summed_hash = arr.each_with_object({}) do |current_hash, result|
  # 遍历每个子哈希的键值对
  current_hash.each do |key, value|
    # 累加对应键的值,第一次遇到键时默认从0开始
    result[key] = (result[key] || 0) + value
  end
end

puts summed_hash
# 输出 => {:a=>12, :b=>14, :c=>13}

如果想要数组形式的输出,直接把结果包进数组就行:[summed_hash],就能得到 [{:a=>12, :b=>14, :c=>13}]。

方法二:用 inject + merge 简洁实现

如果你喜欢更紧凑的代码,inject(和reduce是同一个方法的别名)搭配merge的块参数可以一行搞定核心逻辑:

arr = [{a: 1, b: 2, c:3}, {a:2, b:10, c:2}, {a:9, b:2, c:8}]

summed_hash = arr.inject({}) do |accumulator, current_hash|
  # 合并两个哈希,相同键的值相加
  accumulator.merge(current_hash) { |key, old_val, new_val| old_val + new_val }
end

puts summed_hash
# 同样输出 => {:a=>12, :b=>14, :c=>13}

这个方法的好处是代码更简洁,而且如果你的子哈希里有额外的键(比如某个哈希多了个:d),也能自动把这些键的和算进去,兼容性更强。

额外提示

如果你的数组里可能存在空哈希或者nil元素,这些方法也能正常工作——each会跳过空哈希,但merge遇到nil会报错,所以如果有nil的话可以先过滤掉:arr.compact.each_with_object(...),确保只处理有效的哈希。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:42:37