[英]How do you break/return completely out of a looping function inside another function in 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;
}
是的,由函数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.