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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:27:51