【问题标题】:return from recursive function从递归函数返回
【发布时间】:2018-02-10 17:13:39
【问题描述】:

我有递归函数,它通过深度嵌套的对象或对象数组查找并按键找到想要的对象。问题是当我想返回结果对象时,我得到了未定义,我不知道为什么。当我控制台日志结果时,我得到正确的结果。

function checkForDependency(name, scope) {
    if (Array.isArray(scope)) {
        scope.forEach((el) => {
            return checkForDependency(name, el)
        })
    } else if (typeof scope === 'object') {
        if (scope.hasOwnProperty('name') && scope.name == name && scope.hasOwnProperty('dependency')) {
            console.log('dependency:', scope.dependency)
            return {
                type: scope.dependency
            }
        } else {
            for (let key in scope) {
                if (Array.isArray(scope[key]) || typeof scope[key] === 'object') {
                    return checkForDependency(name, scope[key])
                }
            }
        }
    }
}

你能帮帮我吗?

【问题讨论】:

  • 你使用什么类型的输入来得到错误的结果?
  • 请点击<>并创建minimal reproducible example
  • 您能否提供此函数的示例输入
  • 您有一个if,后跟一个else if...else 块在哪里。在您的 else if 块内也是如此,for-loop 后面没有任何内容。如果这是一个递归函数,你不能让任何路径保持原样,这可能就是你有时会变得不确定的原因
  • 我猜问题出在你的 .forEach 函数上。在第 4 行中,您从一个匿名函数返回,而不是从您的实际递归函数返回。

标签: javascript recursion


【解决方案1】:

您可以使用临时变量提前退出并检查临时变量是否有值,然后退出函数。

你不需要检查数组,因为你可以迭代数组的键或者作为一个对象,这是一样的。

function checkForDependency(name, scope) {
    var temp;
    if (typeof scope !== 'object') {                    // early exit if no object
        return;
    }
    if (scope.name === name && 'dependency' in scope) { // check value and key
        console.log('dependency:', scope.dependency)
        return { type: scope.dependency };              // return found value
    }
    if (Object.keys(scope).some(key => temp = checkForDependency(name, scope[key]))) {
        return temp;
    }
}

【讨论】:

  • 优雅的解决方案。非常感谢:)
猜你喜欢
  • 2021-06-11
  • 2012-09-19
  • 1970-01-01
  • 2015-06-05
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
相关资源
最近更新 更多