2016-06-07 50 views
0

說我有一個這樣的對象:如何在JavaScript中找到訪問節點的深度?

{ 
    visited: true, 
    value: 1, 
    children: [ 
    { 
     visited: true, 
     value: 2, 
     children: [ 
     { 
      visited: true, 
      value: 5, 
      children: [] 
     }, 
     { 
      visited: false, 
      value: 6, 
      children: [] 
     }, 
     { 
      visited: false, 
      value: 7, 
      children: [] 
     }, 
     ] 
    }, 
    { 
     visited: false, 
     value: 3, 
     children: [] 
    }, 
    { 
     visited: false, 
     value: 4, 
     children: [] 
    }, 
    ] 
} 

有沒有一種簡單的方法遍歷這個不使用任何JS框架,終於迴歸3?

我寫了一個遞歸函數來檢查每個關卡中{visited:true}的對象,然後進一步鑽取,直到我找到沒有孩子的訪問節點。我只是想知道是否有任何優化,我可以適用於此?

+0

你會使用for循環或while循環,爲什麼你必須使用JS框架呢?您可能可以使用尾部調用遞歸進行優化。你在這一塊有很多問題,所以你應該關注一個問題。 –

+0

那實際上沒有問題?如果不是,您應該將您的算法發佈到代碼審查。 http://codereview.stackexchange.com/ – theblindprophet

+1

@theblindprophet [codereview.se]不是*算法評論*,它是*代碼評論*。我們回顧真正的實際實現,而不是一些假設的僞代碼。請參閱[Stack Overflow用戶代碼審查指南](http://meta.codereview.stackexchange.com/q/5777/23788) –

回答

0

這是一個迭代函數。它假定訪問過的節點都處於父子關係中,在樹中形成一個唯一的路徑。作爲獎勵,它返回訪問節點的值。訪問節點的數量是那麼當然該數組的長度:

function collectVisited(child) { 
 
    var data, values = []; 
 
    while ((data = child).visited) { 
 
     child = {}; 
 
     values.push(data.value); 
 
     for (child of data.children) { 
 
      if (child.visited) break; 
 
     } 
 
    } 
 
    return values; 
 
} 
 

 
// Sample data 
 
var data = { 
 
    visited: true, 
 
    value: 1, 
 
    children: [ 
 
    { 
 
     visited: true, 
 
     value: 2, 
 
     children: [ 
 
     { 
 
      visited: true, 
 
      value: 5, 
 
      children: [] 
 
     }, 
 
     { 
 
      visited: false, 
 
      value: 6, 
 
      children: [] 
 
     }, 
 
     { 
 
      visited: false, 
 
      value: 7, 
 
      children: [] 
 
     }, 
 
     ] 
 
    }, 
 
    { 
 
     visited: false, 
 
     value: 3, 
 
     children: [] 
 
    }, 
 
    { 
 
     visited: false, 
 
     value: 4, 
 
     children: [] 
 
    }, 
 
    ] 
 
}; 
 

 
var values = collectVisited(data); 
 

 
console.log(values.length); 
 
console.log(values);

0

我不是說這是最好的/最快/最有效的解決方案。

const object = [{...}]; // put the object you provided in the array 

console.log(count(object)); // returns 3 

function count(root) { 
    return root.children.length? 1 + Math.max(...root.children.map(item => count(item))) : 1; 
} 

或者,如果傷害你的眼睛...:

function count(root) { 
    if(root.children.length) { 
     return 1 + Math.max(...root.children.map(item => count(item))); 
    } else return 1; 
} 

我很好奇你是如何做到的遞歸函數。我在等待評論。