繁体   English   中英

如何打破递归函数内的for循环并以Javascript返回?

[英]How to break out of a for loop inside a recursive function and return in Javascript?

我正在尝试比较两个对象的键,属性的值无关紧要。

var obj1 = {
    foo: {
        abc: "foo.abc",
    },
    bar: {
        aaa: {
            bbb: "bar.aaa.bbb" // <-- difference
        }
    }
};

var obj2 = {
    foo: {
        abc: "foo.abc",
    },
    bar: {
        aaa: {
            ccc: "bar.aaa.ccc" // <-- difference
        }
    }
};
// function should return true if properties are identical, false otherwise
function compareObjProps(obj1, obj2) {
    for(var prop in obj1) {

        // when comparing bar.aaa.bbb and bar.aaa.ccc
        // this does get logged, but the function doesn't return false
        if(!obj2.hasOwnProperty(prop)) {
            console.log("mismatch found");
            return false;
        }

        if(typeof(obj1[prop]) === "object") {
            compareObjProps(obj1[prop], obj2[prop]);
        }
    }

    // this always returns
    return true;
}

似乎return false不是从顶层函数返回,而是递归函数。

那么当整个匹配函数执行完毕后,如何返回false?

您缺少回报:

    if(typeof(obj1[prop]) === "object"
        && !compareObjProps(obj1[prop], obj2[prop]))
    {
       return false;
    }

否则,递归调用的结果将被完全忽略。

尝试这个:

function compareObjProps(obj1, obj2) {
    var result = true;
    for (var prop in obj1) {
        if (obj1.hasOwnProperty(prop) && !obj2.hasOwnProperty(prop)) {
            console.log("mismatch found");
            result = false;
        } else if (typeof(obj1[prop]) === "object") {
            result = compareObjProps(obj1[prop], obj2[prop]);
        }

        if (!result) {
            break;
        }
    }

    return result;
}

http://jsfiddle.net/gSYfy/4/

是的,由函数B调用的函数A无法告诉B返回。 有人建议返回递归调用的结果,但这不会给您正确的结果,因为它将导致程序返回找到的第一个子对象是否相同,而不是返回所有对象都相同的结果。 我建议您进行以下修改:

if(typeof(obj1[prop]) === "object") {
   if(!compareObjProps(obj1[prop], obj2[prop])){
      return false;
   }
}

这将使您的程序根据需要传播“ false”,但如果结果为“ true”,则使其继续运行。

暂无
暂无

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

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