在递归函数中从循环返回一个值

时间:2015-12-17 05:49:36

标签: javascript recursion baobab

我需要在树中找到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
}

1 个答案:

答案 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