2015-01-26 109 views
0

的父根我有一個JSON對象樹遞歸:如何獲得所選擇的樹節點

{ 
    "saxena": { 
    "chewning": { 
     "betten": {}, 
     "ching": {}, 
     "kelley": {} 
    }, 
    "kobrinsky": { 
     "karniely": {}, 
     "naveh": {}, 
     "rozenfeld": {}, 
     "shalom": {} 
    }, 
    "schriever": { 
     "brinker": {}, 
     "mcleland": {}, 
     "merrick": {} 
    }, 
    "vacant": { 
     "akers": {}, 
     "carlton": { 
     "marvin": {} 
     }, 
     "fox": { 
     "glover": { 
      "clements": {}, 
      "koya": {} 
     }, 
     "holden": {} 
     } 
    } 
    }, 
    "bill": { 
    "phil": { 
     "bob": {}, 
     "smith": {}, 
     "hello": {} 
    }, 
    "bye": { 
     "ok": {}, 
     "hmm": {}, 
     "no": {}, 
     "alright": {} 
    } 
    } 
} 

根名稱是Saxena先生和比爾的樹狀結構。我想創建一個函數來確定用戶搜索的用戶的根名稱。

對於最簡單的情況,如果他們搜索saxena,它會返回saxena。如果他們退還帳單,它將返回帳單。

對於更復雜的情況,如果用戶在她下面搜索任何名字,則會返回saxena。例如,如果我搜索betten,akers,glovers或koya,則將返回saxena。

如果我搜索鮑勃,史密斯或好的話,賬單將被退回。

這是我迄今的工作。我嘗試使用遞歸,但由於某種原因,當我找到選定的名稱時,我返回一個未定義的。

var findRootName = function(data, ltmName) { 
    for (var key in data) { 
     if (key == ltmName) { 
      return key; 
     } else { 
      findNode(data[key], ltmName); 
     } 
    } 
} 

var findNode = function(data, ltmName) { 
    for (var key in data) { 
     if (key == ltmName) { 
      return key; 
     } else { 
      findNode(data[key], ltmName); 
     } 
    } 
} 

http://jsfiddle.net/gthnfta7/7/

有人可以幫我弄清楚,爲什麼我的遞歸函數不工作?

+0

請直接插入JavaScript,請進入的問題你的問題。外部引用作爲您的代碼的唯一參考在StackOverflow中是不允許的,因爲它們有隨着時間的推移而消失或變化的習慣,這會使未來的讀者無法使用該問題,並且Stackoverflow想成爲信息的重要參考,而不僅僅是原來的人提出這個問題,也爲很多人提出了這個問題。 – jfriend00 2015-01-27 00:26:26

+0

你應該這樣做,否則你的問題可能會被關閉。使用「編輯」鏈接修改您的問題,並將相關的代碼插入到問題中。 – jfriend00 2015-01-27 00:32:36

+1

好得多。現在你的問題有更長久的用處。 – jfriend00 2015-01-27 00:38:15

回答

1

問題是,如果發現節點,您沒有返回任何東西。你可以通過這樣寫它簡化你的函數:

var findParent = function(data, childName) { 
    for (var key in data) { 
     if (key === childName || findParent(data[key], childName)) { 
     return key; 
     } 
    } 
}; 
2

一種替代技術,如果您需要在同一數據多次呼籲,是類似如下:

function makeSearcher(data) { 
    var paths = (function makePaths(data, parentPath, store) { 
     var path = parentPath || []; 
     results = store || {}; 
     Object.keys(data).forEach(function(key) { 
      var newPaths = path.concat(key); 
      results[key] = newPaths; 
      makePaths(data[key], newPaths, results); 
     }); 
     return results; 
    })(data); 
    return function(key) { 
     var path = paths[key]; 
     return path && path[0]; 
    }; 
} 

var search = makeSearcher(data); 

search('clements'); //=> 'savena' 

注意,內部makePaths功能比使用更廣泛的在這裏,因爲它也可以用它來返回結果一樣

[ "saxena", "vacant", "fox", "glover", "clements" ]