如何将嵌套Hash的键值全转为小写并合并重复项计数?
解决方案:嵌套哈希键小写转换与count值累加
这个需求核心就是把嵌套哈希的所有键统一转成小写,同时对路径完全重复(转小写后)的项,累加对应的count值。下面是针对Ruby的具体实现方案,亲测能得到你想要的结果:
1. 先定义原哈希
original_hash = { "abc" => { "def" => { "count" => 120 } }, "ABC" => {"DEF" => { "COUNT" => 100 } }, "sample" => {"samplecode" => {"COUNT" => 3 } } }
2. 实现处理方法
因为哈希是嵌套结构,咱们用递归的方式来处理,写两个方法:一个主方法负责顶层哈希的处理,另一个辅助方法用来合并子哈希:
# 主方法:处理哈希的键小写转换与值合并 def normalize_and_merge(hash) result = {} hash.each do |key, value| lower_key = key.downcase if value.is_a?(Hash) # 递归处理子哈希 processed_subhash = normalize_and_merge(value) if result.key?(lower_key) # 已有相同键,合并子哈希 result[lower_key] = merge_subhashes(result[lower_key], processed_subhash) else result[lower_key] = processed_subhash end else # 处理非哈希值(这里对应count的数值) result[lower_key] = (result[lower_key] || 0) + value.to_i end end result end # 辅助方法:递归合并两个子哈希,处理count累加 def merge_subhashes(hash1, hash2) merged = hash1.dup hash2.each do |key, value| lower_key = key.downcase if value.is_a?(Hash) merged[lower_key] = merged.key?(lower_key) ? merge_subhashes(merged[lower_key], value) : value else merged[lower_key] = (merged[lower_key] || 0) + value.to_i end end merged end
3. 调用方法验证结果
final_result = normalize_and_merge(original_hash) puts final_result.inspect # 输出结果:{"abc"=>{"def"=>{"count"=>220}}, "sample"=>{"samplecode"=>{"count"=>3}}}
代码逻辑说明
- 递归适配嵌套结构:不管你的哈希嵌套多少层,递归都能逐层处理,不用局限于固定的三层结构。
- 键统一小写:每一层的键都会通过
downcase转成小写,确保"ABC"和"abc"、"COUNT"和"count"被识别为同一个键。 - 自动累加数值:当遇到相同路径的哈希时,会递归合并子哈希,遇到数值型的值(比如
count)就自动累加,就算有其他数值型的键也能按同样逻辑处理。
内容的提问来源于stack exchange,提问作者Imara
相关产品推荐
相关产品推荐

