本文章主要介绍了js中比较两个对象是否相同的方法
1. 常规比较
在两个相同数据的对象中比较值。s1保存一个堆的地址,s2保存一个堆的地址,这两个堆的地址是不同的,所以它们不等。
const s1 = {
name: 'Martin'
}
const s2 = {
name: 'Martin'
}
console.log(s1 === s2) // false
2. 原生js实现对象是否相等
var obj1 = {
name: 'Martin',
age: 18,
obj: {
item1: {
a: 'a',
b: 'b'
},
item2: {
c: 'c'
},
item3: {
d: 'd'
}
},
list1: [
{
id: 1,
title: '我是谁'
},
{
id: 2
},
{
id: 3
}
]
}
var obj2 = {
name: 'Martin',
obj: {
item1: {
a: 'a',
b: 'b'
},
item3: {
d: 'd'
},
item2: {
c: 'c'
}
},
list1: [
{
id: 1,
title: '我是谁'
},
{
id: 2
},
{
id: 3
}
],
age: 18
}
// 通过封装的函数进行比较
console.log(isEqual(s1, s2)) // true
console.log(isEqual(obj1, obj2)) // true
function isEqual(obj1, obj2) {
function isObject(obj) {
return obj !== null && typeof obj === 'object'
}
// 1.两个数据有一个不是对象或数组
if (!isObject(obj1) || !isObject(obj2)) {
return obj1 === obj2
}
// 2.两个对象是同一个引用
if (obj1 === obj2) {
return true
}
const obj1Keys = Object.keys(obj1)
const obj2Keys = Object.keys(obj2)
// 3.比较obj1和obj2的keys的长度是否相等
if (obj1Keys.length !== obj2Keys.length) {
return false
}
// 4.通过递归逐一比较,如有由一项不匹配直接返回false
for (const key in obj1) {
const res = isEqual(obj1[key], obj2[key])
if (!res) {
return false
}
}
// 5.全部相等
return true
}