

resultの２次元配列になるようなsplit内のコードがわかりません。  
ライブラリは使用しません。

[code]

    [
      {
        :type=>"h1", :value=>1,
        :children=>[{:type=>"p", :value=>2}]
      },
      {
        :type=>"h2", :value=>3,
        :children=> [
          {
            :type=>"p", :value=>4,
            :children=>[
              {:type=>"p", :value=>5},
              {:type=>"h3", :value=>6}
            ],
          },
          {:type=>"p", :value=>7},
          {
            :type=>"h3", :value=>8,
            :children=>[{:type=>"h3", :value=>9}]
          }
        ]
      },
      {
        :type=>"h2", :value=>11,
        :children=>[{:type=>"p", :value=>10}]
      }
    ]
    
    def split(obj)
      # Please this code
    end
    
    # result
    [
      ["h1:1", "p:2"],
      ["h2:3", "p:4", "p:5" ],
      ["h3:6", "p:7"],
      ["h3:8"],
      ["h3:9"],
      ["h2:11", "p:10"],
    ]
    
[/code]


CC BY-SA 4.0
2020-06-13T07:44:29.637
67622
2020-06-16T09:28:14.853
2020-06-13T08:32:58.943
40635
question
ruby
Rubyで配列を組み替える方法を知りたい


あまりスマートではないですが…

再帰を使ってデータを取り出してから、flattenを使って1次元化し、hが含まれる要素から次のhが含まれる要素までを1つの配列(ary2)に入れて、ary2が次に移るタイミングでary2をary3にコピーします。  
構造を壊してるので、(nekketsuuu♦さんも書いていますし、個人的にはハッシュじゃなくていいの？と思います)あなたが本当に欲しいものかはわかりませんが、参考まで。

[code]

    def split(obj)
      b = extract(obj)
      union(b)
    end
    
    def extract(obj)
      ary = []
      obj.each { |elem|
        type = ""
        value = ""
        a = []
        elem.each { |k, v|
          if k == :children
            b = extract(v)
            a.push(b)
          else
            type = v if k == :type
            value = v if k == :value
          end
        }
        a.prepend("#{type}:#{value}")
        ary << a
      }
      ary.flatten
    end
    
    def union(ary)
      ary2 = []
      ary3 = []
      ary.each do |elem|
        if elem.include?("h")
          if !ary2.empty?
            ary3.push(ary2)
            ary2 = []
          end
          ary2.push(elem)
        elsif elem.include?("p")
          ary2.push(elem)
        end
      end
      ary3.push(ary2)
      ary3
    end
    
[/code]


CC BY-SA 4.0
2020-06-16T09:03:12.240
67721
2020-06-16T09:28:14.853
2020-06-16T09:28:14.853
40151
40151
67622
answer