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

如何用Ruby基于位置相似性合并含数组值的哈希?

解决Ruby哈希按特定规则合并的问题

看起来你需要的不是简单的哈希合并,而是按层级结构对应位置拼接元素的定制化合并。我来给你一步步拆解实现方案:

首先,先明确你的需求核心:两个哈希的顶级键("Us"、"Pa")对应数组,数组内的每个元素是[标识, 值数组]的结构,需要把相同顶级键、相同标识下的值数组按位置用|拼接起来。

实现代码

先定义你的原始哈希:

a = { "Us" => [["1", ["1", "2"]], ["2", ["1"]]], "Pa" => [["1", ["1", "3", "5"]], ["4", ["7"]]] }
b = { "Us" => [["1", ["F", "O"]], ["2", ["N"]]], "Pa" => [["1", ["S", "D", "H"]], ["4", ["K"]]] }

然后用这段代码完成合并:

c = a.each_with_object({}) do |(key, a_groups), result|
  # 获取b中对应键的分组数组
  b_groups = b[key]
  
  # 将分组数组转为哈希,方便按标识快速匹配(标识作为键,值数组作为值)
  a_group_hash = a_groups.to_h
  b_group_hash = b_groups.to_h

  # 遍历a的每个分组,拼接对应的值数组
  merged_groups = a_group_hash.map do |id, a_values|
    b_values = b_group_hash[id]
    # 把两个数组的元素按位置配对,用|连接
    merged_values = a_values.zip(b_values).map { |val_a, val_b| "#{val_a}|#{val_b}" }
    [id, merged_values]
  end

  result[key] = merged_groups
end

代码解释

  1. 遍历顶级键:用each_with_object遍历哈希a的每个顶级键值对,同时构建结果哈希c。
  2. 分组转哈希:把每个顶级键对应的[标识, 值数组]数组转为哈希,这样可以精准匹配相同标识的分组,避免单纯按顺序匹配可能出现的错位问题。
  3. 拼接值数组:对每个标识对应的两个值数组,用zip方法按位置配对元素,再通过map把每对元素用|拼接成新字符串。
  4. 重组结构:把拼接后的结果重新整理成[标识, 拼接后值数组]的结构,存入结果哈希对应的顶级键下。

运行这段代码后,c就会完全符合你想要的结构啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:37:18