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

RoR项目中如何在嵌套Hash里查找指定键的所有值

在嵌套Hash/数组中查找指定键的所有值

嘿,处理这种混合了Hash和数组的嵌套结构,最实用的方式是写一个递归方法来遍历所有层级,收集你要的键对应的所有值。这里给你两种适配Ruby 2.5.0和Rails 5环境的实现方式:

方式一:基础递归实现

这个写法逻辑直白,新手也能轻松理解:

def find_all_values(data, target_key)
  results = []
  case data
  when Hash
    data.each do |key, value|
      # 当前键匹配目标时,把对应值加入结果列表
      if key == target_key
        results << value
      else
        # 不匹配就递归处理当前值(可能是Hash或数组)
        results.concat(find_all_values(value, target_key))
      end
    end
  when Array
    # 遍历数组里的每个元素,递归查找目标键
    data.each do |item|
      results.concat(find_all_values(item, target_key))
    end
  end
  results
end

方式二:用flat_map简化代码

如果你偏爱简洁的Ruby风格,可以用flat_map压缩代码量,功能和上面完全一致:

def find_all_values(data, target_key)
  case data
  when Hash
    data.flat_map do |k, v|
      k == target_key ? v : find_all_values(v, target_key)
    end
  when Array
    data.flat_map { |item| find_all_values(item, target_key) }
  else
    [] # 非Hash/数组类型直接返回空数组
  end
end

使用示例

拿你提供的嵌套数据来测试:

# 你的嵌套结构数据
nested_data = { 
  "lines":[ 
    { 
      "Words":[ 
        { "WordText":"IGA", "Left":619, "Top":948, "Height":20, "Width":9 }, 
        { "WordText":"AU", "Left":905, "Top":951, "Height":20, "Width":18 } 
      ], 
      "MaxHeight":21, 
      "MinTop":948 
    }, 
    { 
      "Words":[ 
        { "WordText":"TAX", "Left":629, "Top":977, "Height":21, "Width":28 }, 
        { "WordText":"485", "Left":895, "Top":980, "Height":20, "Width":28 } 
      ], 
      "MaxHeight":21, 
      "MinTop":977 
    } 
  ] 
}

# 查找所有WordText的值
puts find_all_values(nested_data, "WordText").inspect
# 输出: ["IGA", "AU", "TAX", "485"]

# 查找所有Left的值
puts find_all_values(nested_data, "Left").inspect
# 输出: [619, 905, 629, 895]

注意事项

  • 这个方法会收集所有层级中匹配目标键的值,不管值的类型(比如如果某个键对应的值是另一个Hash/数组,也会完整加入结果)
  • 递归实现对常规业务数据完全友好,只要你的嵌套结构不是无限循环层级,就能正常运行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:51:49