【问题标题】:Iterate through deep nested hash by using Ruby on Rails使用 Ruby on Rails 遍历深层嵌套哈希
【发布时间】:2022-12-11 07:58:03
【问题描述】:

我正在尝试遍历嵌套对象以检索由字符串标识的特定对象。在下面的示例对象中,标识符字符串是“label”属性。我不知道如何遍历树以返回适当的对象。

我的 Ruby 和 Rails 版本很旧。红宝石 - 1.9.3 轨道 - 3.0.9

`

company_tree = {
  label: 'Autos',
  subs: [
    {
      label: 'SUVs',
      subs: []
    },
    {
      label: 'Trucks',
      subs: [
        {
          label: '2 Wheel Drive',
          subs: []
        },
        {
          label: '4 Wheel Drive',
          subs: [
            {
              label: 'Ford',
              subs: []
            },
            {
              label: 'Chevrolet',
              subs: []
            }
          ]
        }
      ]
    },
    {
      label: 'Sedan',
      subs: []
    }
  ]
}

`

我尝试使用下面的代码。但是我没有工作。它只返回第二个数组。它不会超过那个。

`

data = JSON.parse(requestData)

data['company_tree']['subs'].each do |element|
    puts "element=> #{element['subs']}"
end

`

【问题讨论】:

    标签: ruby-on-rails ruby iteration nested-loops traversal


    【解决方案1】:

    假设您有问题中描述的 company_tree 变量,您可以使用递归遍历每个元素及其所有子元素。这是我编写的代码,我将在下面进一步解释

    def destruct_tree(element)
      puts "#{element[:label]} with subs #{element[:subs]}"
      element[:subs].each do |sub|
        destruct_tree sub
      end
    end
    
    destruct_tree company_tree
    

    您为函数提供 company_tree 元素。然后它打印它的标签和子。然后它遍历所有 sub 并将它们再次传递给同一个函数。这将实习生打印他们的标签和潜艇并再次运行他们所有的潜艇。

    我希望这是有道理的

    【讨论】:

      【解决方案2】:

      您可以像下面这样遍历哈希:

      def iterate_through(company_tree)
        puts "#{company_tree[:label]} => #{company_tree[:subs]}"
        company_tree[:subs].each do |sub|
          iterate_through(sub)
        end
      end
      
      iterate_through(company_tree)
      
      
      Output:
      
      Autos => [{:label=>"SUVs", :subs=>[]}, {:label=>"Trucks", :subs=>[{:label=>"2 Wheel Drive", :subs=>[]}, {:label=>"4 Wheel Drive", :subs=>[{:label=>"Ford", :subs=>[]}, {:label=>"Chevrolet", :subs=>[]}]}]}, {:label=>"Sedan", :subs=>[]}]
      SUVs => []
      Trucks => [{:label=>"2 Wheel Drive", :subs=>[]}, {:label=>"4 Wheel Drive", :subs=>[{:label=>"Ford", :subs=>[]}, {:label=>"Chevrolet", :subs=>[]}]}]
      2 Wheel Drive => []
      4 Wheel Drive => [{:label=>"Ford", :subs=>[]}, {:label=>"Chevrolet", :subs=>[]}]
      Ford => []
      Chevrolet => []
      Sedan => []
      

      【讨论】:

        【解决方案3】:

        感谢支持,找到解决办法了

            def iterate(i)
                if i.is_a?(Hash)
                    i.each do |k, v|
                        if v.is_a?(Hash) || v.is_a?(Array)
                            iterate(v)
                        else
                            puts("k is #{k}, value is #{v}")
                        end
                    end
                end
                if i.is_a?(Array)
                    i.each do |v|
                        iterate(v)
                    end
                end
            end
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-04-03
          • 1970-01-01
          • 2013-05-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多