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

如何对哈希数组中相同键的数组值进行对应位置求和

Ruby实现相同键数组按位置求和

这是个很常见的哈希合并与数组元素聚合需求,用Ruby可以很简洁地搞定,我给你拆解步骤并给出完整代码:

完整实现代码

arr = [{"69120090" => [1, 2, 3]}, {"69120090" => [4, 5, 6]}]

# 1. 合并所有哈希,收集相同键对应的所有数组
merged_hash = arr.each_with_object(Hash.new { |h, k| h[k] = [] }) do |item, accumulator|
  item.each do |key, values|
    accumulator[key] << values
  end
end

# 2. 对每个键下的数组按位置逐一求和
summed_hash = merged_hash.transform_values do |arrays|
  arrays.transpose.map { |position_group| position_group.sum }
end

# 转换为要求的数组格式
result = [summed_hash]
puts result.inspect # 输出: [{"69120090"=>[5, 7, 9]}]

步骤解释

  • 合并哈希阶段:
    我们用each_with_object创建了一个默认值为空数组的哈希accumulator。遍历原数组中的每个哈希,把相同键对应的数组都追加到accumulator的对应键值列表中。这一步完成后,merged_hash会变成:{"69120090"=>[[1, 2, 3], [4, 5, 6]]}。

  • 按位置求和阶段:
    用transform_values遍历合并后的哈希,对每个键对应的数组集合做两个操作:

    1. transpose:把二维数组转置,比如[[1,2,3], [4,5,6]]会被转成[[1,4], [2,5], [3,6]],这样就把每个位置的元素聚到了一起;
    2. map { |group| group.sum }:对转置后的每个子数组求和,得到按位置相加的结果。
  • 最终格式转换:把求和后的哈希包装成数组,就得到了你需要的[{"69120090"=>[5, 7, 9]}]。

扩展场景

如果原数组中存在多个不同的键,这个方法同样适用。比如:

arr = [{"69120090"=>[1,2,3], "abc123"=>[10]}, {"69120090"=>[4,5,6], "abc123"=>[20]}]
# 最终结果会是: [{"69120090"=>[5,7,9], "abc123"=>[30]}]

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:03:09