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
相关产品推荐
相关产品推荐

