简体   繁体   English

循环中的javascript递归返回语句不起作用

[英]javascript recursion in loop return statement not working

I have a loop in which I have a recursive function which does not return and stop. 我有一个循环,其中有一个不返回和停止的递归函数。 Here is code 这是代码

var obj = {
    here: { is: "an" },
    object: 2
};
var obj1 = {
    here: { is: "aan" },
    object: 2
};
function objectTester(x) {
    if (typeof x === 'object' && x !== null)
        return true;
    else
        return false;
}

function deepEqual(valOne, valTwo) {
    debugger
    if (objectTester(valOne) && objectTester(valTwo)) {
        for (key in valOne) {
            if (valTwo.hasOwnProperty(key)) {
                if (objectTester(valOne[key]) && objectTester(valTwo[key])) {
                    deepEqual(valOne[key], valTwo[key]);
                }
                else {
                    if (valOne[key] === valTwo[key]) {
                    }
                    else {

                        return false;       //function dose not stop executing and return false
                    }

                }

            }
            else {

                return false;
            }
        }
        return true;
    }
    else {

        return false;
    }
}
console.log(deepEqual(obj, obj1));  

Link 链接

When you call deepEqual recursively here: 当您在此处递归调用deepEqual时:

if (objectTester(valOne[key]) && objectTester(valTwo[key])) {
    deepEqual(valOne[key], valTwo[key]);
}

you are ignoring the return value from the recursive call so its gonna loop over everything irrespective of the inner objects being equal or not. 您将忽略递归调用的返回值,因此无论内部对象是否相等,它都会遍历所有内容。

Try 尝试

if(!deepEqual(valOne[key], valTwo[key])){ return false }

Another alternative is throwing an exception (and catching it at the top) instead of returning booleans. 另一种选择是抛出异常(并在顶部捕获),而不是返回布尔值。 This makes your control flow jump straight out no matter how many levels of recursion you have. 无论您具有多少递归级别,这都使您的控制流直接跳出来。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM