我试图比较两个对象的关键字,属性值并不重要。
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?
答案 0 :(得分:4)
你错过了回报:
if(typeof(obj1[prop]) === "object"
&& !compareObjProps(obj1[prop], obj2[prop]))
{
return false;
}
否则,将完全忽略递归调用的结果。
答案 1 :(得分:2)
试试这个:
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;
}
答案 2 :(得分:0)
是的,函数B调用的函数A不能告诉B返回。有些人建议返回递归调用的结果,但这不会给你正确的结果,因为它会导致程序返回它找到的第一个子对象是否相同,而不是所有对象都是相同的。我建议你做这个修改:
if(typeof(obj1[prop]) === "object") {
if(!compareObjProps(obj1[prop], obj2[prop])){
return false;
}
}
这将使您的程序按照您的需要传播为“假”,但如果结果为“true”则使其继续运行。