gpt4 book ai didi

javascript - 从递归函数中的循环返回一个值

转载 作者:行者123 更新时间:2023-11-29 10:37:32 24 4
gpt4 key购买 nike

我需要在树中通过 id 找到节点。为此,我将在两个嵌套循环的帮助下进行下去。但返回未定义。

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
}

最佳答案

当没有立即找到匹配项时,您递归调用最终应该返回结果的函数。但事实并非如此。

searchInTreeById(cursorChild, matchingId);

但是,使用 map 会将检查/函数应用到每个 child ,但结果无论如何都会丢失,在这种情况下。 map 函数将参数中给定的函数应用于数组元素,并为每个元素返回新值 - 一个新数组。根据找到项目的速度,在内存中构建树的副本(传统的递归函数只保留元素到节点的路径)。

因此,您可以将映射结果分配给一个数组,如果该特定子项没有匹配项,则每个元素都设置为 null,或者 node 如果成立。然后检查该创建的数组的所有元素,如果找到则返回 nullnode(然后,调用者在该级别填充数组等...)。

你也可以使用全局变量

var found = null;

仅在匹配时设置(否则不做任何事情)。由于看起来 map 是不可破坏的,因此无论如何都会检查该级别的 child 。但是,不同之处在于,在再次递归调用该函数之前,您会检查全局变量,并在 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)

关于javascript - 从递归函数中的循环返回一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34327490/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com