2017-12-25 20 views
2

以下のデータがあります。ネストされたセットをネストされた配列に変換する方法

[ 
    {"no":1, "name":"ELECTRONICS", "depth":0}, 
    {"no":2, "name":"TELEVISIONS", "depth":1}, 
    {"no":3, "name":"TUBE", "depth":2}, 
    {"no":4, "name":"LCD", "depth":2}, 
    {"no":5, "name":"PLASMA", "depth":2}, 
    {"no":6, "name":"PORTABLE ELECTRONICS", "depth":1}, 
    {"no":7, "name":"MP3 PLAYERS", "depth":2}, 
    {"no":8, "name":"FLASH", "depth":3}, 
    {"no":9, "name":"CD PLAYERS", "depth":2}, 
    {"no":10, "name":"2 WAY RADIOS", "depth":2} 
] 

以下のようなデータを取得したいと考えています。

[ 
    { 
     "no":1, 
     "name":"ELECTRONICS", 
     "depth":0, 
     "child_nodes":[ 
      { 
       "no":2, 
       "name":"TELEVISIONS", 
       "depth":1 
       "child_nodes":[ 
        { 
         "no":3, 
         "name":"TUBE", 
         "depth":2 
        }, 
        ... 
       ] 
      }, 
      { 
       "no":6, 
       "name":"PORTABLE ELECTRONICS", 
       "depth":1 
       "child_nodes":[ ... ] 
      } 
     ] 
    } 
] 

私は再帰的に試していますが、それは良くありません。私はバベルを使用しているので、javascriptの新しい機能に大きな制限はありません。あなたが良いアイデアを持っているなら、私に知らせてください。ありがとう!

+1

[それをお試しください!]特定 'parent' – charlietfl

答えて

6

レベルに対してヘルパー配列を使用できます。

var array = [{ no: 1, name: "ELECTRONICS", depth: 0 }, { no: 2, name: "TELEVISIONS", depth: 1 }, { no: 3, name: "TUBE", depth: 2 }, { no: 4, name: "LCD", depth: 2 }, { no: 5, name: "PLASMA", depth: 2 }, { no: 6, name: "PORTABLE ELECTRONICS", depth: 1 }, { no: 7, name: "MP3 PLAYERS", depth: 2 }, { no: 8, name: "FLASH", depth: 3 }, { no: 9, name: "CD PLAYERS", depth: 2 }, { no: 10, name: "2 WAY RADIOS", depth: 2 }], 
 
    result = [], 
 
    levels = [{ children: result }]; 
 

 
array.forEach(function (o) { 
 
    levels[o.depth].children = levels[o.depth].children || []; 
 
    levels[o.depth].children.push(levels[o.depth + 1] = o); 
 
}); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+2

これはすごく簡単です。これは単に素晴らしいです。 –

+0

良いアイデア!どうもありがとう。 –

1
//The trees root = our expected result 
const result = []; 
var acc = { depth: -1, children: result}; 

for(const el of data){ 
    //walk upwards in the tree 
    var up = acc.depth - el.depth + 1 ; 
    while(up--){ acc = acc.parent } 
    //walk down and add the current el as a child 
    el.parent = acc; 
    (acc.children || (acc.children = [])).push(el); 
    acc = el; 
} 

console.log(result); 

あなたはツリー(acc)を歩き、両親/子供を一緒にリンクすることができます。

+0

に' depth'を関連付けるれるべき(http://jsbin.com/kibahevuha/edit?console) –

+0

それは役立っていますたくさん。ありがとう!! –

関連する問題