如何用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
代码解释
- 遍历顶级键:用
each_with_object遍历哈希a的每个顶级键值对,同时构建结果哈希c。 - 分组转哈希:把每个顶级键对应的
[标识, 值数组]数组转为哈希,这样可以精准匹配相同标识的分组,避免单纯按顺序匹配可能出现的错位问题。 - 拼接值数组:对每个标识对应的两个值数组,用
zip方法按位置配对元素,再通过map把每对元素用|拼接成新字符串。 - 重组结构:把拼接后的结果重新整理成
[标识, 拼接后值数组]的结构,存入结果哈希对应的顶级键下。
运行这段代码后,c就会完全符合你想要的结构啦!
内容的提问来源于stack exchange,提问作者Ger Cas
相关产品推荐
相关产品推荐

