我需要在树中找到id的节点。为此,我将在两个嵌套循环的帮助下下降。但是返回undefined。
function searchInTreeById(node, matchingId) {
var res;
if (node.select('id').get() == matchingId) {
res = node.get();
return res
} else {
if (node.exists('childObjects')) {
node.select('childObjects').map(function (cursor, i) {
cursor.select('children').map(function (cursorChild, j) {
if (cursorChild.select('id').get() === matchingId) {
// console.log(cursorChild.get()) //this console.log is execute
res = cursorChild.get();
return res;
} else {
// console.log(cursorChild.get())
searchInTreeById(cursorChild, matchingId)
}
})
})
} else {
res = node;
}
}
return res
}
答案 0 :(得分:3)
如果未立即找到匹配项,则会递归调用最终应返回结果的函数。但事实并非如此。
searchInTreeById(cursorChild, matchingId);
但是,使用 map 会将检查/功能应用于每个孩子,但在这种情况下结果会丢失。 map 函数将参数中给出的函数应用于数组元素,并返回每个元素的新值 - 一个新数组。根据项目的查找速度,在内存中构建树的副本(传统的递归函数仅保留元素到节点的路径)。
因此,您可以将地图结果分配给一个数组,如果该特定子项没有匹配项,则将每个元素设置为 null ,或者如果节点,则将其设置为 null 找到。然后检查创建的数组的所有元素,如果找到则返回 null 或 node (然后,调用者在该级别填充数组等)。< / p>
您还可以使用全局变量
var found = null;
仅在匹配时设置(否则不执行任何操作)。由于 map 似乎无法破解,因此无论如何都会检查该级别的子级。但是,不同之处在于,在再次递归调用函数之前,检查全局变量,如果 found 仍然为null,则仅调用 。
但也许 map 可以一起避免吗?
不是使用 map ,而是将子集合在一个数组中并迭代该数组,递归调用该函数,并立即返回节点匹配。
建议代码(未经测试)
function searchInTreeById(node, matchingId) {
if (node.select('id').get() == matchingId) {
return node.get();
}
if (node.exists('childObjects')) {
var list = node.select('childObjects');
for(var i=0 ; i<list.length ; i++) {
var res = searchInTreeById(list[i], matchingId);
if (res) return res;
}
}
return null;
}
免责声明: baobab 第一个计时器。 (我读过this)