2016-03-10 109 views
0

我綁定遍歷JavaScript中的分層樹來確定它有多少級別。這裏是我的樹的短片段:分層樹中遞歸

parent: [ 
    { id: 1 } 
    { 
     child1: [ 
      { id: 2 } 
      { 
       child2: [ 
        { id: 3 } 
        {} 
       ] 
      } 
     ], 
     child3: [ 
      { id: 4 } 
      { 
       child4: [ 
        { id: 5 } 
        {} 
       ], 
       child5: [ 
        { id: 6 } 
        { 
         child6: [ 
          { id: 7 } 
          {} 
         ] 
        } 
       ] 
      } 
     ] 
    } 
] 

會有未知數的父母和孩子。有一定的把握:

  • 每個元素(例如,父母)總是有它的數組中的2個對象。 第一個對象始終是一個ID。 第二個對象包含它擁有的子項。這可能是空的或填充

我的目標是確定樹的層數。例如,此示例樹中有4個級別(parent = 1,child1 + child3在同一級別(2),child4和child5在同一級別(3),child6 = 4)。

這是我到目前爲止的代碼:

for (var j in dependencyTree) { 
    if (getObjectSize(dependencyTree[j][1]) > 0) { 
     levelsArray.push(j + ': ' + recursiveFunction(dependencyTree[j][1], 1)); 
    } 
} 


function recursiveFunction(obj, lvls) { 
    if (getObjectSize(obj) > 0) { 
     for (var i in obj) { 
      recursiveFunction(obj[i][1], lvls++); 
     } 
    } 
    return lvls; 
} 

getObjectSize()僅返回對象的大小。即有多少直接的孩子。例如,對象parent將返回2(child1child3)。

在開始的時候,頂級parent的孩子都進入了這個函數。

我想我的問題是,for環路(for (var i in obj)),因爲可能會搶第一個孩子parent有(child1),並最終將返回級的數量child1具有即使child3有更多。

任何幫助表示讚賞。

(還沒有嘗試lodash但都被告知它不提供遞歸幫助)

編輯

{ 
    "Mobile": [ 
     { 
      "id": 89 
     }, 
     { 
      "Mobile Client": [ 
       { 
        "id": 100 
       }, 
       {} 
      ] 
     } 
    ], 
    "Service Platform": [ 
     { 
      "id": 90 
     }, 
     { 
      "Service Platform": [ 
       {..." 

EDIT(新提出的格式)

我剛纔講與我的同事一樣,新提出的數據格式是:

[ 
    { 
     "name": "Mobile", 
     "id": 89, 
     "children": [ 
      { 
       "name": "Mobile Client", 
       "id": 100, 
       "children": {} 
      } 
     ] 
    } 
]; 

這似乎是更可行的數據並即將實施的明天

+0

你有過的數據格式的任何控制?看起來數據是以一種奇怪的方式編碼的,具體來說,有些數組應該是對象而對象應該是數組。 – Daniel

+0

@Daniel我正在與通過REST Call提供數據的人交談,他說可以操縱它。你認爲它可以更好地格式化嗎? – wmash

+0

我會從使用有效的JSON開始。這意味着你擁有的任何對象都應該被命名,否則使用類似數組的方式遍歷對象 – Daniel

回答

1

儘管格式,這種解決方案遍歷數組中的所有元素,以及在objecs和計數。

function count(array) { 
 
    var c = 0; 
 
    array.forEach(function (a) { 
 
     c++; 
 
     if (typeof a === 'object') { 
 
      Object.keys(a).forEach(function (k) { 
 
       if (Array.isArray(a[k])) { 
 
        c += count(a[k]); 
 
       } 
 
      }); 
 
     } 
 
    }); 
 
    return c; 
 
} 
 

 
var parent = [{ id: 1 }, { child1: [{ id: 2 }, { child2: [{ id: 3 }, {}, ] }], child3: [{ id: 4 }, { child4: [{ id: 5 }, {}], child5: [{ id: 6 }, { child6: [{ id: 7 }, {}] }] }] }], 
 
    newFormat = [{ "name": "Mobile", "id": 89, "children": [{ "name": "Mobile Client", "id": 100, "children": {} }] }]; 
 

 
document.write('<pre>' + JSON.stringify(count(parent), 0, 4) + '</pre>'); 
 
document.write('<pre>' + JSON.stringify(parent, 0, 4) + '</pre><hr>'); 
 
document.write('<pre>' + JSON.stringify(count(newFormat), 0, 4) + '</pre>'); 
 
document.write('<pre>' + JSON.stringify(newFormat, 0, 4) + '</pre>');

1

這裏是一些示例代碼,給你一個想法如何遍歷數據 - 信息是通過控制檯可見。

var a = [ 
 
    { id: 1 }, 
 
    { 
 
    child1: [ 
 
     { id: 2 }, 
 
     { 
 
      child2: [ 
 
       { id: 3 }, 
 
       {} 
 
      ] 
 
     } 
 
    ], 
 
    child3: [ 
 
     { id: 4 }, 
 
     { 
 
      child4: [ 
 
       { id: 5 }, 
 
       {} 
 
      ], 
 
      child5: [ 
 
       { id: 6 }, 
 
       { 
 
        child6: [ 
 
         { id: 7 }, 
 
         {} 
 
        ] 
 
       } 
 
      ] 
 
     } 
 
    ] 
 
    } 
 
]; 
 

 
var getNumChildren=function(obj){ 
 
    var a = 0; 
 
    if(obj[1]){ 
 
for (var key in obj[1]) { 
 
    a++; 
 
    var res = getNumChildren(obj[1][key]); 
 
    console.log(res,a); 
 
    a += res; 
 
} 
 
    } 
 
    return a; 
 
} 
 

 

 
console.log(getNumChildren(a));

只要格式化數據所說,這種格式可能會更有意義和更容易理解和使用

[ 
    {"id":1, 
    "children":[ 
     {"id":2,"children":[ 
     {"id":4,"children":[]}, 
     {"id":5,"children":[]} 
     ]}, 
     {"id":3,"children":[]} 
    ] 
    } 
] 

編輯

i如果您更新數據格式,則可以使用此代碼。

var data =[ 
 
    {"id":1, 
 
    "children":[ 
 
     {"id":2,"children":[ 
 
     {"id":4,"children":[]}, 
 
     {"id":5,"children":[]} 
 
     ]}, 
 
     {"id":3,"children":[]} 
 
    ] 
 
    }, 
 
    {"id":6,"children":[]} 
 
] 
 

 
var getNumChildren=function(ca){ 
 
    var n = ca.length; 
 
    ca.map(function(c){n += getNumChildren(c.children);}) 
 
    return n 
 
} 
 

 
document.write("result: " + getNumChildren(data));

+0

數據的格式將被編輯。爲了清晰起見,請查看我的上述編輯感謝您的幫助! – wmash