2017-08-03 6 views
0

フラットツリーリストを多次元配列に変換するjavascript関数があります。私はこの関数が各アイテムにtree_levelプロパティも追加したいと思っています。ツリーリストの取得レベル - JavaScript

function getNestedChildren(arr, parent) { 
    var out = [] 
    for (var i in arr) {  
      if (arr[i].headerId == parent) { 
       var children = getNestedChildren(arr, arr[i].workID) 

       if (children.length) { 
        arr[i].children = children 
       } 
       out.push(arr[i]) 
      } 
    } 
    return out 
} 

答えて

1

ツリーレベルのパラメータを追加します。

function getNestedChildren(arr, parent, level) { 
    var out = [] 
    for (var i in arr) { 
      if (arr[i].headerId == parent) { 
       arr[i].level = level; 

       var children = getNestedChildren(arr, arr[i].workID, level + 1) 

       if (children.length) { 
        arr[i].children = children 
       } 
       out.push(arr[i]) 
      } 
    } 
    return out 
} 
+0

それはちょうどIF文の下のレベルのASSIGN文をシフトし、それは私が編集した – Khalil

+0

に最後のレベル値を与えています私の答え。 – Khalil

+0

を働いたすべての項目 –

0

あなたの最初の関数は、n個のアレイをn回通過し、それは引数の変異します。その引数を変化させません

アンO(n)のES6ソリューション:

function getNestedChildren(arr, root) { 
    const empty = []; 
    const childrenOf = {}; 

    // build a dictionary containing all nodes keyed on parent 
    arr.forEach((node) => { 
     if (!childrenOf[node.headerId]) childrenOf[node.headerId] = []; 
     childrenOf[node.headerId].push(node); 
    }); 

    // attach children to their parents and decorate with level 
    const iterateHash = (parent, level) => { 
     const nodes = childrenOf[parent] || empty; 
     return nodes.map((node) => { 
      const children = iterateHash(node.workId, level + 1); 
      // remove the first argument {} to mutate arr 
      return Object.assign({}, node, { level, children }); 
     }); 
    }; 

    return iterateHash(root, 0); 
} 
関連する問題