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

如何将嵌套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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:01:35