前言:如何判断俩个对象相等,且对象中包含对象
判断两个对象是否相等在JavaScript中是一个比较复杂的问题,因为对象是引用类型,直接使用==或===比较两个对象时,比较的是它们的内存地址,而非它们的内容。要判断两个对象的内容是否相等,你需要比较它们的结构和每个属性的值。
const obj1 = {
name: '小米',
age:12
}
const obj2 = {
name: '小米',
age:12
}
console.log(obj1 === obj2) /false
它们的内存地址不同所以是false
const obj1 = {
name: '小米',
age:12
}
const obj2 = {
name: '小米',
age:12
}
const obj3 = obj1
console.log(obj1 === obj3) /true
浅拷贝,指向同一内存,所以是true
以下是常用方法来判断俩个对象是否相等
- 手动比较每个属性
function isObjectEqual(obj1, obj2){
//获取自己属性的name, 不包含原型对象的
const props1 = Object.getOwnPropertyNames(obj1);
const props2 = Object.getOwnPropertyNames(obj2);
if(props1.length !== props2.length){
return false;
}
//再检查每个属性的值是否相等
for(let prop of props1){
const val1 = obj1[prop]
const val2 = obj2[prop]
//如果值也是对象,需要递归处理
const areObjects = isObject(val1) && isObject(val2);
//总结不想等的情况
//1.都是对象,递归后的值不相等
//2.都不是对象,或者其中一个不是对象,那么它们的值不相等
if(areObjects && !isObjectEqual(val1, val2) || !areObjects && val1 !== val2){
return false
}
}
return true
}
function isObject(obj){
return obj != null && typeof obj === 'object';
}
const obj1 = {
name: '小米',
father:{
name:'小妹'
}
}
const obj2 = {
name: '小米',
father:{
name:'小妹'
}
}
console.log(isObjectEqual(obj1, obj2)) / true
2.使用 JSON.stringify
但要注意,因为JSON.stringify会根据属性的添加顺序生成字符串,所以即使两个对象的内容完全相同,但属性的顺序不同,也会被认为是不等的。此外,某些JavaScript环境中的对象可能包含不能转换为JSON字符串的属性,如函数或循环引用,这种情况下此方法会失败。
function isObjectEqual(obj1, obj2) {
return JSON.stringify(obj1) === JSON.stringify(obj2);
}
3.使用第三方库
比如Lodash的isEqual方法,它可以深度比较两个对象的值,而且处理了各种边缘情况,是一个非常强大且简便的方法。