Javascript 使用递归进行深度对象比较

Javascript 使用递归进行深度对象比较,javascript,recursion,arrow-functions,Javascript,Recursion,Arrow Functions,我正在尝试使用递归进行深层对象比较,但我的函数返回未定义的 我知道有更好的方法来比较对象(即JSON.Stringify()),但我不明白为什么我的函数返回未定义的 功能deepObjCompare(obj1、obj2){ Object.keys(obj1).forEach((key)=>{ 常量键1=obj1[键]; 常数key2=obj2[key]; 如果(键2){ if(typeof key1==“object”&&key1!==null){ deepObjCompare(键1、键2);

我正在尝试使用递归进行深层对象比较,但我的函数返回
未定义的

我知道有更好的方法来比较对象(即
JSON.Stringify()
),但我不明白为什么我的函数返回
未定义的

功能deepObjCompare(obj1、obj2){
Object.keys(obj1).forEach((key)=>{
常量键1=obj1[键];
常数key2=obj2[key];
如果(键2){
if(typeof key1==“object”&&key1!==null){
deepObjCompare(键1、键2);
}else if(键1==键2){
返回true;
}
}
返回false;
});
}
常数obj1={
姓名:“比尔”,
地址:{
城市快讯:“巴黎”,
城市未来:“纽约”
},
年龄:39
};
常数obj2={
姓名:“比尔”,
地址:{
城市快讯:“巴黎”,
城市未来:“纽约”
},
年龄:39
};
常数obj3={
姓名:“鲍勃”,
地址:“巴黎”,
年龄:39
};

日志(deepObjCompare(obj1,obj3))
不能从
forEach
循环返回,必须返回递归调用:

功能deepObjCompare(obj1、obj2){
设keys=Object.keys(obj1);
返回键。every((键)=>{//使用for of循环而不是forEach
常量键1=obj1[键];
常数key2=obj2[key];
如果(键2){
if(typeof key1==“object”&&key1!==null){
return deepObjCompare(key1,key2);//返回递归调用
}else if(键1==键2){
返回true;
}
}
返回false;
});
}
const obj1={姓名:“比尔”,地址:{城市名称:“巴黎”,城市未来:“纽约”},年龄:39};
const obj2={姓名:“比尔”,地址:{城市名称:“巴黎”,城市未来:“纽约”},年龄:39};
const obj3={姓名:“比尔”,地址:“巴黎”,年龄:39};
log(“Obj1和Obj3相等吗?”,deepObjCompare(Obj1,Obj3));

log(“Obj1和Obj2相等吗?”,deepObjCompare(Obj1,Obj2))我在这里看到三个主要问题:

  • deepObjCompare
    缺少return语句,这就是为什么它隐式返回
    undefined
  • .forEach
    方法始终返回
    未定义的
    ,因此您需要将其更改为另一个将返回实际值的方法。我认为
    。每一个
    都是你想要的
  • 您不会返回递归调用的结果
总之,这会将您的代码片段更改为以下内容:

功能deepObjCompare(obj1、obj2){
返回Object.keys(obj1).every((key)=>{//Use.every并返回结果!
常量键1=obj1[键];
常数key2=obj2[key];
如果(键2){
if(typeof key1==“object”&&key1!==null){
return deepObjCompare(key1,key2);//返回递归调用的结果!
}else if(键1==键2){
返回true;
}
}
返回false;
});
}
常数obj1={
姓名:“比尔”,
地址:{
城市快讯:“巴黎”,
城市未来:“纽约”
},
年龄:39
};
常数obj2={
姓名:“比尔”,
地址:{
城市快讯:“巴黎”,
城市未来:“纽约”
},
年龄:39
};
常数obj3={
姓名:“鲍勃”,
地址:“巴黎”,
年龄:39
};
console.log(deepObjCompare(obj1,obj3));//假的

console.log(deepObjCompare(obj1,obj2));//真的
实际上,我发现这个实现有很多地方是错误的。但至于它返回未定义的
的原因,那是因为您的函数实际上从未返回任何内容。所有
return
语句都在传递给
forEach
的函数内部,因此对于外部
deepObjCompare

可能重复的语句不做任何操作:您将要使用
。每个
。切勿使用forEach
此程序的复杂性很容易被忽略。我鼓励大家看看我对上述问题的回答。
JSON。stringify
不是比较对象的合适方法,因为它们可能以不同的顺序序列化。有人能解释一下反对票吗?我很感激我没有给出一个比较对象的解决方案,因此它不如其他给出的答案好。但我的时间有限,听起来OP只是想知道为什么他们的
没有定义
,以期自己修复它。在这一点上,我相信我的答案是正确的。没有什么不快的感觉,我只是对参加SO比较陌生,我想从我的错误中吸取教训。我无法解释投票的结果,也许读者认为你的贡献很短。当人们解释他们的投票时是很好的,但是他们没有被要求这样做;他们是故意匿名的。我的观点是,尽管欢迎任何人添加评论,要求解释,但这可能是浪费时间,因为选民通常早就不在了。