如何对哈希数组中相同键的数组值进行对应位置求和
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遍历合并后的哈希,对每个键对应的数组集合做两个操作:transpose:把二维数组转置,比如[[1,2,3], [4,5,6]]会被转成[[1,4], [2,5], [3,6]],这样就把每个位置的元素聚到了一起;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
相关产品推荐
相关产品推荐

