2016-09-08 26 views
2

私はこの質問を解決する手掛かりがありません。 dataというarrayの中にnestedhashがあります。ここにその構造があります。ネストされたハッシュでグループ化する方法を教えてください。

data = 
[ 
    { 
       :id => 1, 
      :name => "S1", 
     :children => [ 
      { 
         :id => 10, 
        :name => "S10", 
       :children => [ 
        { 
          :id => 20, 
         :name => "S20" 
        } 
       ] 
      } 
     ] 
    }, 
    { 
       :id => 1, 
      :name => "S1", 
     :children => [ 
      { 
         :id => 10, 
        :name => "S10", 
       :children => [ 
        { 
          :id => 21, 
         :name => "S21" 
        } 
       ] 
      } 
     ] 
    }, 
    { 
       :id => 1, 
      :name => "S1", 
     :children => [ 
      { 
         :id => 11, 
        :name => "S11", 
       :children => [ 
        { 
          :id => 22, 
         :name => "S22" 
        } 
       ] 
      } 
     ] 
    } 
] 

あなたが見ることができるように、そこに第一層または第2層に同じidを持つ要素の束があるので、私はグループにそれらを必要とします。

が、私は結果がしかし

data.group_by{|s| s[:id]} 

よう

result= 
[ 
    { 
       :id => 1, 
      :name => "S1", 
     :children => [ 
      { 
         :id => 10, 
        :name => "S10", 
       :children => [ 
        { 
          :id => 20, 
         :name => "S20" 
        }, 
        { 
          :id => 21, 
         :name => "S21" 
        } 
       ] 
      }, 
      { 
         :id => 11, 
        :name => "S11", 
       :children => [ 
        { 
          :id => 22, 
         :name => "S22" 
        } 
       ] 
      } 
     ] 
    } 
] 

私が試した気にいらないことを願って、それが唯一のグループ第一層は、私にはわからないだろうかのグループにネスト構造に。

答えて

1

ええ、あなたは再帰的に結合し、入れ子になった子をグループ化するために何らかの種類の再帰的メソッドが必要です。

これは、あなたが望む結果を生成します。それは本当に驚くべきことだ

def group(data) 
    r = {} 
    # Combine the children 
    data.each do |d| 
    if r[d[:id]] 
     r[d[:id]][:children] += d[:children] 
    else 
     r[d[:id]] = d 
    end 
    end 
    # Now group the children 
    r.values.map do |d| 
    d[:children] = group(d[:children]) if d[:children] 
    d 
    end 
end 
+0

を、再帰的には、私のために困難です。あなたに大きな助けをありがとう! –

関連する問題