我正在学习Javascript中的递归,这是到目前为止我得到的。此函数遍历树并找到具有匹配名称属性的对象。由于需要将起点设置为根,因此我创建了一个递归,以将根用作起点。
for循环中途的第一个if语句应返回匹配项。我已经在控制台中对其进行了调试,因此我知道该返回由于任何我不知道的原因而无法正常工作(任何见解都将有助于学习!)。
设置的控制台按照我的预期进行记录,布尔检查表明确实发生了匹配,但是最后仍然变得不确定!
findInTree(name) {
let start = this.first(); //root object of the tree
function findName (start, name) {
if (start.name === name) {
return start;
} else {
for (let set of start.offspring) {
if (set.name === name) {
console.log(set); // returns the correct set!
console.log(set.name === name) //returns true;
return set;
} else {
findName(set, name);
}
}
}
}
return findName(start, name);
}
// returns undefined...
答案 0 :(得分:0)
如果递归找到了您要查找的内容,您只想从循环中返回。否则,您想继续循环。您可以测试结果并决定是否返回:
let obj = {
first: {
name: "test",
offspring:[
{name: "test1", offspring:[]},
{name: "test2", offspring:[{name:"test21", offspring:[]}]},
{name: "test3", offspring:[
{name: "test31", offspring:[]}
]},
]
},
findInTree(name) {
let start = this.first; //root object of the tree
function findName (start, name) {
if (start.name === name) {
return start;
} else {
for (let set of start.offspring) {
if (set.name === name) {
console.log(set); // returns the correct set!
console.log(set.name === name) //returns true;
return set;
} else {
let found = findName(set, name); // only return if you've found
if (found) return found // what you're looking for
}
}
}
}
return findName(start, name);
}
}
console.log(obj.findInTree("test31"))
答案 1 :(得分:0)
您认为这行得通吗?将递归调用移出for循环。只有在for循环中找不到匹配项时,才调用函数findName。如果可能的话,可以将代码放在jsfiddle或其他地方,以便我看看。
findInTree(name) {
let start = this.first(); //root object of the tree
function findName (start, name) {
if (start.name === name) {
return start;
} else {
for (let set of start.offspring) {
if (set.name === name) {
console.log(set); // returns the correct set!
console.log(set.name === name) //returns true;
return set;
}
}
return findName(set, name); //if the match is not found in the forloop, we call findname
}
}
return findName(start, name);
}