2015-01-26 88 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" ]