Ruby on Rails 5(Ruby 2.5.0)中如何在Hash内搜索指定词?
解决嵌套Hash中搜索指定关键词的问题
针对你在Ruby 2.5.0 + Rails 5项目里遇到的嵌套Hash搜索需求,我整理了一套递归遍历的实现方案,能帮你检查Hash的键和值里是否存在目标关键词,同时返回匹配的具体内容。
核心思路
因为你的Hash结构是多层嵌套的(包含数组、子Hash),所以必须通过递归遍历覆盖所有层级:
- 检查每个键是否为字符串,并且匹配目标词
- 针对值做分类处理:字符串直接匹配,Hash/数组则继续递归深入
- 最后返回是否找到匹配,以及去重后的匹配词列表
精确匹配的实现代码
这个版本会严格匹配目标词(只有当键或值完全等于目标词时才会被捕获):
def search_nested_hash(hash, target_words) matches = [] hash.each do |key, value| # 检查键是否匹配目标词 matches << key if key.is_a?(String) && target_words.include?(key) case value when String matches << value if target_words.include?(value) when Hash # 递归处理嵌套子Hash matches.concat(search_nested_hash(value, target_words)) when Array # 遍历数组元素,若为Hash则递归处理 value.each do |item| matches.concat(search_nested_hash(item, target_words)) if item.is_a?(Hash) end end end # 去重避免重复匹配结果 matches.uniq! { found: !matches.empty?, matched_words: matches } end
使用示例
假设你已经把JSON解析成了Ruby Hash(用JSON.parse即可完成转换),可以这样调用:
# 对应你给出的JSON结构的示例Hash sample_hash = { "data" => { "Lines" => [ { "Words" => [{ "WordText" => "Walmart", "Left" => 63, "Top" => 33, "Height" => 72, "Width" => 364 }], "MaxHeight" => 72, "MinTop" => 33 }, { "Words" => [{ "WordText" => "Save", "Left" => 70, "Top" => 116, "Height" => 26, "Width" => 100 }] } ] } } # 要搜索的目标词列表 target_words = ["Walmart", "Save"] # 执行搜索 result = search_nested_hash(sample_hash, target_words) puts result[:found] # 输出 true puts result[:matched_words] # 输出 ["Walmart", "Save"]
可选:模糊匹配版本
如果你需要的是包含目标词而非完全匹配(比如搜索"Wal"能匹配到"Walmart"),可以用这个修改后的方法:
def search_nested_hash_fuzzy(hash, target_words) matches = [] hash.each do |key, value| # 检查键是否包含任意目标词 if key.is_a?(String) target_words.each do |word| matches << key if key.include?(word) end end case value when String target_words.each do |word| matches << value if value.include?(word) end when Hash matches.concat(search_nested_hash_fuzzy(value, target_words)) when Array value.each do |item| matches.concat(search_nested_hash_fuzzy(item, target_words)) if item.is_a?(Hash) end end end matches.uniq! { found: !matches.empty?, matched_words: matches } end
这个版本会遍历每个目标词,检查键或值是否包含该词,适合更灵活的搜索场景。
内容的提问来源于stack exchange,提问作者awsm sid
相关产品推荐
相关产品推荐

