测试检查两个对象的属性值是否相同(不只判断相等)
程序员文章站
2022-04-09 20:42:05
...
通常情况下JS要 obj1 === obj2 是检查两个变量所指向的对象是否相同,如果我们要检查两个不同的对象的所有属性值是否相等,用obj1 === obj2是不行的,这个时候就要遍历两个对象的所有属性是否相等,遇到对象属性是数组或者对象的情况就需要进行递归检查,上代码:
testObjSame (obj1, obj2) {
// debugger
if (obj1 === obj2) {// 常规情况
return true
}
// 对象转json字符对比相同则肯定对象值相同这里可以过滤大部分情况
if (JSON.stringify(obj1) === JSON.stringify(obj2)) {
return true
}
const keys1 = Object.keys(obj1)
const keys2 = Object.keys(obj2)
if (keys1.length !== keys2.length) {// 属性字段列表长度不一致则肯定不相同
return false
}
const kset = new Set([...keys1, ...keys2])
const keys3 = Array.from(kset)// 长度相同的情况下取并集
if (keys3.length !== keys2.length) {// 并集多于或者少于原始的则对象不相同
return false
}
// 遍历属性
for (let i = 0; i < keys3.length; i++) {
const k = keys3[i];
const o1 = obj1[k]
const o2 = obj2[k]
// 如果是对象(数组也是对象)则递归判断,这里没有考虑function的情况
if (typeof o1 === 'object' && typeof o2 === 'object') {
if (!testObjSame(o1, o2)) {
return false
}
} else if (o1 !== o2) {
return false
}
}
return true
}
测试:
const d = testObjSame({ a: 1, b: [{ a: 1, b: 2 }] }, { b: [{ b: 2, a: 2 }], a: 1 })
console.log(d)
const d2 = testObjSame({ a: 1, b: [{ a: 1, b: 2 }] }, { a: 1, b: [{ a: 1, b: 2 }] })
console.log(d2)
未经严格测试,如有错误请留言。