TypeScript 递归函数返回 undefined

3

我可以帮您翻译,以下是需要翻译的内容:

我有一个对象数组,其结构如下:

{
  Name: "Automotive"
  RefCategory: 1,
  ChildCategories:[{
     Name: "Car"
     RefCategory: 2,
     ChildCategories: []
  },{
     Name: "Motorcycle"
     RefCategory: 3,
     ChildCategories: []
  }]
}

我编写了一个函数,用于查找给定Ref的类别节点:
navigateToNode(node: any, RefCategoryToFind: number): any {

    if (node.RefCategory == RefCategoryToFind)
        return node;

    node.ChildCategories.forEach(value => {
        if (value.RefCategory == RefCategoryToFind)
            return value;
        else {
            if (value.ChildCategories.length !== 0)
                return this.navigateToNode(value, RefCategoryToFind);                
        }
    });
}

当我调用这个函数时,它返回null。

let x = this.navigateToNode(this.activeCategories[0], 2);

我能看到它执行了return value;并找到了正确的节点,但返回值是未定义的。

forEach的回调函数会返回一些东西,但这并不意味着navigateToNode会返回任何东西。 - undefined
但是当它遇到return语句时,它不应该退出吗?我该如何调整它使其正常工作? - undefined
回调函数退出。外部函数是独立的。为什么不使用普通的for循环呢? - undefined
1个回答

5

你的回调函数返回了一个值,但是包装函数没有返回任何东西。尝试在找到返回值时保存它并返回:

navigateToNode(node: any, RefCategoryToFind: number): any {

    if (node.RefCategory == RefCategoryToFind)
        return node;

    var result;

    node.ChildCategories.forEach(value => {
        if (value.RefCategory == RefCategoryToFind) {
            result = value;
            return value;
        } else {
            if (value.ChildCategories.length !== 0)
                return this.navigateToNode(value, RefCategoryToFind);                
        }
    });
    return result;
}

你好。我刚遇到了一个类似的情况。我的函数是这样工作的 function parentUnit(element) { var unit = element.parentElement; if (unit != null) { if (!unit.classList.contains("unit")) { unit = parentUnit(unit); } } return unit; } 但是我很好奇为什么包装函数需要返回一个值,如果IF语句已经有了(我在if(unit.classList.contains("unit")里面有return unit;,但它返回了undefined)。 - undefined
@iJassar,你的情况有所不同。请注意上面的代码中有一个value => {...},这是一个箭头函数。问题中的return语句存在于这个内部的箭头函数中,但包装函数没有返回值。在你的情况下,有一个单独的JavaScript函数,它接受一个名为element的输入参数,将其parentElement放入unit中,并且如果unit没有unit类,则通过对parentUnit进行递归调用来覆盖unit。在函数的最后,unit被返回。 - undefined
@iJassar现在,你的函数用简单的话来说做了以下几件事情:当元素没有一个单位类时,向上遍历层级。现在,如果你传递给这个函数的元素既没有该类,也没有其祖先中的任何一个,那么这个函数将会向上遍历父级、祖父级等,直到没有更多定义的父级为止。然后,这个未定义的值将被返回给调用者,然后再返回给调用者的调用者,依此类推,直到它达到初始调用,初始调用也将返回未定义的值。 - undefined
@iJassar,所以你的问题是,在你的代码中假设传递给函数或其任何祖先的元素具有unit类,因此你需要查看涉及的HTML结构。 - undefined
谢谢你,Lajos!问题是我分享的代码实际上是有效的。但如果我在if语句里面加上return unit;,它就不起作用了,这一点毫无道理,因为if语句并不是函数内的一个函数,所以这种行为的原因是什么呢? - undefined
@iJassar,原因是您传递给函数的标签的所有祖先元素中都没有unit类,因此parentUnit函数会被递归调用,不断将parentElement作为参数传递给被调用的函数,直到达到parentElement为空的状态。然后将其返回给调用者,然后由调用者将其返回给调用者的调用者,依此类推。这就是undefined的原因。如果还不清楚,请提出一个单独的问题,并在评论部分向我发送链接。答案功能可以让我更好地解释这个问题。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接