树递归:如何获取所选树节点的父根
Tree Recursion: How to get the parent root of the selected tree node
我有一个 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。
例如,如果我搜索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/
有人可以帮助我并找出为什么我的递归函数不起作用吗?
问题是在
找到节点时不会返回任何内容。你可以通过这样编写来简化你的函数:
var findParent = function(data, childName) {
for (var key in data) {
if (key === childName || findParent(data[key], childName)) {
return key;
}
}
};
如果需要对相同的数据进行多次调用,另一种技术如下所示:
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" ]
相关文章:
- 在不添加树节点的情况下从网格拖放到树
- 在自定义截面树中获取父节点
- 在带有 标记的树节点上以编程方式触发单击事件
- JavaScript:在XML中搜索节点并从该节点获取数组
- 在angularJS中从树视图获取叶节点深度
- JsTree:如何在将节点从一棵树拖到第二棵树时获取事件
- JsTree从未渲染的节点获取html属性
- d3树节点位置
- 用于构建树节点层次结构的javascript库
- 如何从jstree中的选定节点获取所有子节点
- 树递归:如何获取所选树节点的父根
- 如何在角度UI树中获取某个项目的键值或迭代
- 如何将 css 类添加到 Ext4 中的树节点
- jQuery - 在XML树中获取某些标记
- 分页动态加载的 Webix 树节点
- 当我在 Dojo 中左键单击树行(树节点)时,如何从对象存储中获取 ID
- 如何获取选择 JS 树节点时的祖先
- 如何在extjs树中获取select节点的索引
- 如何从jQuery复选框树中获取选定的节点项
- 为什么不在遍历DOM树时从文本节点获取值呢?