2017-09-24 10 views
1

私はトラバースが必要なオブジェクトの配列を持っており、深さが進むにつれて各ノードでtreeLevel属性を割り当てる必要があります。 私は次のプランカーを作成しましたhttps://plnkr.co/edit/wou4Vj?p=info 私は旅行の部分を理解しましたが、各ノードでtreeLevelsを割り当てる方法を知ることができません。以下はネストされたオブジェクトを移動してフラットなオブジェクトを構築する

sampleInput = [ 
    { 
     sectorName: 'a', 
     sectorType: 'a', 
     sectors: [ 
     { 
      sectorName: 'a-a1', 
      sectorType: 'a-a1', 
      sectors: [ 
      { 
       sectorName: 'a-a1-a1', 
       sectorType: 'a-a1-a1', 
      }, 
      { 
       sectorName: 'a-a1-a2', 
       sectorType: 'a-a1-a2', 
      }, 
      { 
       sectorName: 'a-a1-a3', 
       sectorType: 'a-a1-a3', 
      } 
      ] 
     }, 
     { 
      sectorName: 'a-a2', 
      sectorType: 'a-a2', 
     }, 
     { 
      sectorName: 'a-a3', 
      sectorType: 'a-a3', 
      sectors: [ 
      { 
       sectorName: 'a-a3-a1', 
       sectorType: 'a-a3-a1', 
       sectors: [ 
       { 
        sectorName: 'a-a3-a1-a1', 
        sectorType: 'a-a3-a1-a1', 
       } 
       ] 
      } 
      ] 
     } 
     ] 
    }, 
    { 
     sectorName: 'b', 
     sectorType: 'b', 
    }, 
    { 
     sectorName: 'c', 
     sectorType: 'c', 
     sectors: [ 
     { 
      sectorName: 'c-c1', 
      sectorType: 'c-c2', 
     } 
     ] 
    } 
    ]; 

、treeLevelをインクリメントするロジックは、我々は現在のオブジェクトの一部としてのセクター配列を持っている場合は、現在のオブジェクトがそれをtreeLevelを割り当てるコピーすることである

"[ 
    {"sectorName":"a","sectorType":"a","$$treeLevel":0}, 
    {"sectorName":"a-a1","sectorType":"a-a1","$$treeLevel":1}, 
    {"sectorName":"a-a1-a1","sectorType":"a-a1-a1","$$treeLevel":0}, 
    {"sectorName":"a-a1-a2","sectorType":"a-a1-a2","$$treeLevel":0}, 
    {"sectorName":"a-a1-a3","sectorType":"a-a1-a3","$$treeLevel":0}, 
    {"sectorName":"a-a2","sectorType":"a-a2","$$treeLevel":0}, 
    {"sectorName":"a-a3","sectorType":"a-a3","$$treeLevel":1}, 
    {"sectorName":"a-a3-a1","sectorType":"a-a3-a1","$$treeLevel":2}, 
    {"sectorName":"a-a3-a1-a1","sectorType":"a-a3-a1-a1","$$treeLevel":3},  
    {"sectorName":"b","sectorType":"b","$$treeLevel":0}, 
    {"sectorName":"c","sectorType":"c","$$treeLevel":0}, 
    {"sectorName":"c-c1","sectorType":"c-c2","$$treeLevel":1} 
]" 

、私は出力として期待していものですtreeLevelをインクリメントしてから再帰します。 しかし、同じ親の直接の子には正しいtreelevelが割り当てられることに注意してください。例えば、上記の{"sectorName":"a-a3","sectorType":"a-a3","$$treeLevel":1},の場合、 'a-a3'は 'a-a1'の直接の子であり、treeLevelは1であり、ゼロではありません。

私はこれを手伝ってもらえますか?ツリーレベルの割り当てをどのように働かせるかを理解する必要があります。私はすべてのソリューション、再帰的、非再帰的な、lodashのlibなどを使用して開いています。

ありがとうございます。

+0

なぜ、より深いレベルでは、希望の結果にゼロのレベルをもたらすのでしょうか? –

+0

treeLevelは深さを示すものとします。だからあなたのオブジェクトにそれ以上の子セクターがない場合、私はtreeLevelを0に設定して深さがないことを示します。しかし、後で私は自分のコードを更新し、treeLevelを子を持たないオブジェクトから削除しました。 – digitalis

答えて

0

実際のレベルを格納し、ネストされたレベルごとにインクリメントすることができます。

function getFlat(array) { 
 
    var result = []; 
 
    array.forEach(function flat(level) { 
 
     return function (o) { 
 
      result.push({ sectorName: o.sectorName, sectorType: o.sectorType, $$treeLevel: level }); 
 
      o.sectors && o.sectors.forEach(flat(level + 1)); 
 
     }; 
 
    }(0)); 
 
    return result; 
 
} 
 

 
var data = [{ sectorName: 'a', sectorType: 'a', sectors: [{ sectorName: 'a-a1', sectorType: 'a-a1', sectors: [{ sectorName: 'a-a1-a1', sectorType: 'a-a1-a1', }, { sectorName: 'a-a1-a2', sectorType: 'a-a1-a2', }, { sectorName: 'a-a1-a3', sectorType: 'a-a1-a3', }] }, { sectorName: 'a-a2', sectorType: 'a-a2', }, { sectorName: 'a-a3', sectorType: 'a-a3', sectors: [{ sectorName: 'a-a3-a1', sectorType: 'a-a3-a1', sectors: [{ sectorName: 'a-a3-a1-a1', sectorType: 'a-a3-a1-a1', }] }] }] }, { sectorName: 'b', sectorType: 'b', }, { sectorName: 'c', sectorType: 'c', sectors: [{ sectorName: 'c-c1', sectorType: 'c-c2', }] }], 
 
    result = getFlat(data); 
 

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

+0

フラット()がトリックをしました。これは何とか私がトラバース()を書いたときに見逃した。私はそれが行った配列をトラバースすることにもっと集中していましたが、私はtreeLevelの小道具に注意を払っていませんでした。ありがとう... – digitalis

関連する問題