如何在深度嵌套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
相关产品推荐
相关产品推荐

