2015-12-17 94 views
3

我需要通過樹中的id查找節點。爲此,我正在兩個嵌套循環的幫助下。但是返回undefined。在遞歸函數中從循環中返回一個值

function searchInTreeById(node, matchingId) { 
    var res; 
    if (node.select('id').get() == matchingId) { 
     res = node.get(); 
     return res 
    } else { 
     if (node.exists('childObjects')) { 
      node.select('childObjects').map(function (cursor, i) { 
       cursor.select('children').map(function (cursorChild, j) { 

        if (cursorChild.select('id').get() === matchingId) { 
         // console.log(cursorChild.get()) //this console.log is execute 
         res = cursorChild.get(); 
         return res; 
        } else { 
         // console.log(cursorChild.get()) 
         searchInTreeById(cursorChild, matchingId) 
        } 
       }) 
      }) 
     } else { 
      res = node; 
     } 
    } 
    return res 
} 
+0

忽略的'searchInTreeById'看起來很懷疑結果(不知道什麼是「猴麪包樹」的,所以也許它是確定在不管它是什麼) –

+0

@AlexeiLevenkov如果我設置解析度= searchInTreeById(cursorChild, matchId),然後func返回上次訪問的節點... –

+2

注意:'map'通常是執行搜索的錯誤方式 - 很可能有另一個函數(類似於Array.find),它允許停止迭代中間。 –

回答

3

當沒有立即找到匹配項時,可以遞歸調用最終應返回結果的函數。但事實並非如此。

searchInTreeById(cursorChild, matchingId); 

但是,使用地圖將適用檢查/功能,每一個孩子,但結果總會丟失,在這種情況下。 函數將參數中給出的函數應用於數組元素,並返回每個元素的新值 - 一個新數組。根據找到項目的速度有多快,樹的副本會建立在內存中(傳統的遞歸函數只保留元素到達節點的路徑)。

所以,你可以在地圖的結果分配到一個數組,每個元素設置爲如果要是發現特定子沒有一個匹配,或節點。然後你檢查所創建的數組的所有元素,並返回null節點如果找到(然後,調用者在該級別填充數組等)。

你也可以使用全局變量

var found = null; 

只有當存在匹配(沒有做,否則)設置。由於地圖不是易碎的,因此無論如何將檢查該級別的孩子。但是,區別在於,在再次調用函數之前,請檢查全局變量,並且僅在調用,如果發現仍爲空。

但也許地圖可以避免所有在一起?

而不是使用地圖,收集數組中的孩子,迭代數組,迭代調用該函數,並立即返回節點匹配。

建議代碼(未測試)

function searchInTreeById(node, matchingId) { 
    if (node.select('id').get() == matchingId) { 
     return node.get(); 
    } 
    if (node.exists('childObjects')) { 
     var list = node.select('childObjects'); 
     for(var i=0 ; i<list.length ; i++) { 
      var res = searchInTreeById(list[i], matchingId); 
      if (res) return res; 
     } 
    } 
    return null; 
} 

聲明:猴麪包第一定時器。 (我讀this雖然)

+0

非常感謝你!我修改了一下這段代碼,它的工作原理是這樣的! –

+0

那麼你改變了什麼,使用全局變量?將地圖結果放入數組中?迭代孩子? –

+0

迭代兒童和更換與猴麪包樹相關的部件?像這樣: var list = parentNode.select('childObjects')。get(); –