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
相关产品推荐
相关产品推荐

