【发布时间】:2015-11-04 23:34:58
【问题描述】:
我正在尝试开发一个函数来搜索树状结构并返回所有通过简单字符串测试 (indexOf) 的节点的完整路径。 我认为我有点接近,因为我可以处理任意深度的 N 个根节点,只要路径是线性的。当我分支时会出现问题,因为应该发生的是每个分支都变成一个包含其整个路径的不同数组。然而,正在发生的事情是每个分支都被合并到一个公共数组中,该数组表示发生分支的父级的所有子级下的匹配路径。
http://plnkr.co/edit/tbH0FW6T11F3iwNIBHdN?p=preview
在上图中,结果应包含三个元素,每个元素代表遍历的不同路径(字符串测试匹配“Z”)。 [1aa,1a,1],[1aba,1aa,1a,1],[2aa,2a,2]
注释掉数据中的“Zoe”条目以在线性和分支测试之间切换。
(function(){
var data =
[
{"name" : "Mike" , "id" : "1","children" :
[
{"name" : "Jim" , "id" : "1a", "children" :
[
{"name" : "Zoe" , "id" : "1aa", "children":[]}, //Uncomment for fail test
{"name" : "Carrie" , "id" : "1ab", "children" :
[
{"name" : "Zane" , "id" : "1aba", "children":[]}
]}
]}
]},
{"name" : "Allen" , "id" : "2","children" :
[
{"name" : "Fred" , "id" : "2a", "children" :
[
{"name" : "Zach" , "id" : "2aa", "children" :
[
{"name" : "Dean" , "id" : "2aaa", "children":[]}
]}
]}
]}
];
var rFX = function(val,item){
var subMatches =[];
subMatches = (item.children.map(function(child){
return rFX(val,child);
}));
subMatches = [].concat.apply([], subMatches);
if(item.name.indexOf(val) > -1 || subMatches.length >0){
subMatches.push(item.id);
}
return subMatches;
};
var result = data.map(function(item){
return rFX("Z",item);
});
console.log(result);
})();
【问题讨论】:
-
重新思考
rFX的返回值应该是什么样子。然后检查您对递归调用的结果所做的操作是否正确。 -
现在重新思考,尝试不同的方法,因为我看不出这种方法如何避免合并子树。
-
如何定义“子树”?它是一个路径数组的数组吗?
-
@Bergi,是的...最终结果中的每个数组都应该代表单个匹配节点的完整路径。目前,该算法将子路径/子树合并到一个数组中,而不是保持它们不同。 sn-p 中数据的算法的正确结果是 [1aa,1a,1],[1aba,1aa,1a,1],[2aa,2a,2]
-
是的,您需要将多个路径数组合并为一个路径数组(其中每个路径仍然是一个数组)。但是你仍然有一系列路径。那么你现在打算用你当前的
item.id做什么呢? (发布的代码有什么作用?)
标签: javascript recursion