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

如何在深度嵌套Hash中匹配指定键并修改其所有对应值?

深度修改Ruby嵌套Hash中指定键的值

需求说明

遍历深度嵌套的Ruby Hash(包含数组内的Hash),将所有键为:status的对应值统一修改为"TRANSFORMED"。

纯Ruby递归实现(无框架依赖)

这是通用方案,适用于所有Ruby环境:

def transform_status(data)
  case data
  when Hash
    data.each_with_object({}) do |(key, value), new_data|
      new_data[key] = key == :status ? "TRANSFORMED" : transform_status(value)
    end
  when Array
    data.map { |item| transform_status(item) }
  else
    data
  end
end

# 使用示例
original_hash = {:id=>"11ed35b8e53c442ea210c39d6f24bddf",
 :createdAt=>"2022-09-16T12:12:55.454Z",
 :updatedAt=>"2022-09-16T12:12:55.454Z",
 :status=>"ACTIVE",
 :description=>"test",
 :goals=>
  [{:Definitions=>[],
    :text=>"Follows Action Plan Appropriately, Worse or Warning Symptoms",
    :status=>"ACTIVE",
    :Definitions=>[{:text=>"Search for relics", :status=>"INACTIVE", :id=>"11ec1fc4bd36f876963867013cee2799"}],
    :id=>"11e818be2f0157329c76634ee23c1d8f"}],
 :healthConcernDefinitions=>[]}

modified_hash = transform_status(original_hash)

实现逻辑

  • 递归遍历所有嵌套元素:
    • 若当前元素是Hash,遍历键值对,遇到:status键直接赋值"TRANSFORMED",否则继续递归处理对应值
    • 若当前元素是Array,对数组内每个元素递归执行转换逻辑
    • 其他类型(字符串、数字等)直接返回原值,不做修改

Rails环境下的简化实现(可选)

如果项目基于Rails,纯递归方案同样适用,也可以结合Rails扩展方法实现:

def transform_rails_status(data)
  case data
  when Hash
    data.deep_transform_values do |val|
      val # 这里仅演示,实际仍需结合键判断,所以纯递归方案更直接
    end
    # 更严谨的写法还是复用纯递归逻辑
    transform_status(data)
  when Array
    data.map { |item| transform_rails_status(item) }
  else
    data
  end
end

对比原有方案的优势

你之前的两种方案基于值匹配修改,存在误改风险(比如其他键的"ACTIVE"/"INACTIVE"值会被错误替换)。而上述方案是键精准匹配,只修改:status键对应的值,逻辑更严谨,不会产生意外修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:20:28