如何搜索嵌套哈希数组和哈希数组并仅从父节点返回匹配对象?

2023-11-30

假设我嵌套了以下 ruby​​ 哈希

hash_or_array = [{
  "book1" => "buyer1",
  "book2" => {
    "book21" => "buyer21", "book22" => ["buyer23", "buyer24", true]
  },
  "book3" => {
    "0" => "buyer31", "1" => "buyer32", "2" => "buyer33", 
    "3" => [{
      "4" => "buyer34",
      "5" => [10, 11],
      "6" => [{
        "7" => "buyer35"
      }]
    }]
  },
  "book4" => ["buyer41", "buyer42", "buyer43"],
  "book5" => {
    "book5,1" => "buyer5"
  }
}]

我想搜索匹配的字符串buyer35。在比赛中,我希望它返回以下结果

"book3" => {
    "3" => [{
      "6" => [{
        "7" => "buyer35"
      }]
    }]
  }]

所有其他不匹配的键、值、数组都应该被省略。我有以下示例,但它不太有效

def search(hash)
    hash.each_with_object({}) do |(key, value), obj|
      if value.is_a?(Hash)
        returned_hash = search(value)
        obj[key] = returned_hash unless returned_hash.empty?
      elsif value.is_a?(Array)
        obj[key] = value if value.any? { |v| matches(v) }
      elsif matches(key) || matches(value)
        obj[key] = value
      end
    end
end


def matches(str)
    match_criteria = /#{Regexp.escape("buyer35")}/i
    (str.is_a?(String) || str == true || str == false) && str.to_s.match?(match_criteria)
end



....
=> search(hash_or_array)

任何帮助表示赞赏。我意识到,我需要使用递归,但无法完全弄清楚如何从父节点构建/跟踪匹配的节点。


您可以使用以下递归方法。

def recurse(obj, target)
  case obj
  when Array
    obj.each do |e|
      case e
      when Array, Hash
        rv = recurse(e, target)
        return [rv] unless rv.nil?
      when target
        return e
      end
    end
  when Hash
    obj.each do |k,v|
      case v
      when Array, Hash
        rv = recurse(v, target)
        return {k=>rv} unless rv.nil?
      when target
        return {k=>v}
      end
    end
  end
  nil
end
recurse(hash_or_array, "buyer35")
  #=> [{"book3"=>{"3"=>[{"6"=>[{"7"=>"buyer35"}]}]}}]
recurse(hash_or_array, "buyer24")
  #=>[{"book2"=>{"book22"=>"buyer24"}}]
recurse(hash_or_array, "buyer33")
  #=> [{"book3"=>{"2"=>"buyer33"}}]
recurse(hash_or_array, 11)
  #=> [{"book3"=>{"3"=>[{"5"=>11}]}}]
recurse(hash_or_array, "buyer5")
  #=>[{"book5"=>{"book5,1"=>"buyer5"}}]

如果需要,可以写,例如,

recurse(hash_or_array, "buyer35").first
  #=> {"book3"=>{"3"=>[{"6"=>[{"7"=>"buyer35"}]}]}}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何搜索嵌套哈希数组和哈希数组并仅从父节点返回匹配对象? 的相关文章

  • Rails actionmailer 打开主机电子邮件应用程序

    我想通过链接打开用户的默认邮件应用程序 附加附件 收件人 字段为空 主题和正文中包含一些预先填充的文本 使用 ActionMailer 我可以让它从我的 Gmail 帐户发送 但它不会打开默认的电子邮件应用程序 这是我在 ActionMai
  • “gem install Rails”因 DNS 错误而失败

    rvm use Using home owner rvm gems ruby 2 1 2 gem install rails ERROR While executing gem Gem RemoteFetcher FetchError Er
  • 查找数组中的组合

    我在java中有一个像这样的二维数组 transmission communication tv television approach memorycode methodact 我需要获得所有组合 例如 transmission appr
  • 循环中的递归算法复杂度(运行时间)

    我想了解您对如何检测以下递归算法的 T n 运行时间 的意见 Charm 是一种用于发现事务数据库中频繁闭项集的算法 频繁闭项集列表是在一组交易 tids 中多次出现的频繁项 例如面包和牛奶是经常一起购买的物品 它们是通过将索引为 i 的当
  • 使用 Ruby 中的 Turn_left 方法更改朝向

    我需要创建一个方法turn left来改变朝向 朝向总是从 南开始 我正在实现一个移动到木板上的机器人 所以如果我调用方法turn left应该将朝向改变为东 然后为北 然后为西 然后返回南方 我在想这样的事情 0 S 1 E 2 N 3
  • 查找重叠间隔序列中最大和的算法

    我试图解决的问题在数轴上有一个间隔列表 每个间隔都有一个预定义的分数 我需要返回最大可能的总分 问题是间隔重叠 并且重叠间隔中我只能使用一个 这是一个例子 Intervals Score 0 5 15 4 9 18 10 15 12 8 2
  • Unicorn + Rails + 大型上传

    我试图在使用 Rails 在 Heroku 上运行 Unicorn 时允许进行大型上传 但我意识到任何大型上传可能需要比 Unicorn 工作线程的超时时间更长的时间 这意味着 我见过这种情况发生 Unicorn 主进程将杀死上传大文件的工
  • 对产品列表进行分类的算法? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个代表或多或少相同的产品的列表 例如 在下面的列表中 它们都是希捷硬盘 希捷硬盘 500Go 适用于笔记本电脑的希捷硬盘 120
  • “捆绑安装”是否会在我的计算机上永久安装所有必需的 gem?

    我是 Rails 新手 正在学习捆绑器 我明白那个bundle install安装 gemfile 中指定的所有 gem 但将它们安装到哪里 是否将它们永久安装在我的计算机上 以便将来的任何项目都可以使用它们 如果是这样 这是否意味着我的计
  • 如何找到给定顶点的所有多边形?

    我有一个顶点列表 并且我知道它们之间的连接 我试图找到顶点的所有多边形形状 这些多边形形状不应重叠 我做了一些研究 我认为如果我可以顺时针 或逆时针 没有区别 遍历顶点 我可以检测多边形形状 因此 我寻找顺时针遍历顶点的解决方案 我发现了一
  • 使用 Capistrano 无法开始延迟的作业

    我无法使用 capistrano 配方启动延迟的作业流程 这是我收到的错误 usr local lib ruby gems 1 9 1 gems delayed job 2 1 1 lib delayed command rb 62 in
  • 有人真正有效地实现了斐波那契堆吗?

    你们中有人曾经实施过斐波那契堆 http en wikipedia org wiki Fibonacci heap 几年前我就这样做了 但它比使用基于数组的 BinHeaps 慢了几个数量级 当时 我认为这是一个宝贵的教训 告诉我们研究并不
  • 如何制作可选的强参数键但过滤嵌套参数?

    我的控制器中有这个 params require item permit 让我们假设这个 rspec 规范 它按预期工作 put update id item id item name new name 然而 以下原因ActionContr
  • 如何使用多个 { 'not find' } 来干燥方法?

    我正在尝试优雅地处理以下错误的 JSON 其中Hash fetch似乎不是一个选择 使用 Hash fetch 优雅地处理错误的 JSON https stackoverflow com questions 25193627 handle
  • 快速查找具有最大总不同元素的列表列表的子集

    给定元组列表的列表 我想找到列表的子集 该子集最大化不同整数值的数量 而不重复任何整数 该列表看起来像这样 x 1 2 3 8 9 10 15 16 2 3 10 11 9 10 11 17 18 19 20 21 22 4 5 11 12
  • 为什么路径压缩不会改变 UnionFind 中的排名?

    我正在研究 UnionFind 的实现 并从这里进行排序和路径压缩http en wikipedia org wiki Disjoint set data struct Disjoint set forests http en wikipe
  • 归并排序究竟进行了多少次比较?

    我读到 在实践中 快速排序比合并排序快得多 其原因是隐藏常量 那么 随机快速排序复杂度的解是2nlnn 1 39nlogn 这意味着快速排序中的常数是1 39 但是合并排序呢 归并排序中的常数是什么 让我们看看能否解决这个问题 在合并排序中
  • ruby 中 for 循环的语法

    如何在 Ruby 中执行这种类型的 for 循环 for int i 0 i
  • 在 Ruby 文档中哪里可以找到字符串转义序列?

    我可以在 中找到有关 Ruby 转义序列的详细信息 红宝石弦 http www tutorialspoint com ruby ruby strings htm and 转义序列 http en wikibooks org wiki Rub
  • Networkx 中 Louvain 分区的可视化

    请帮助我更改 Louvain 聚类算法结果的可视化 我从网站上获取了代码https github com taynaud python louvain https github com taynaud python louvain我可以重写

随机推荐