前沿
在前端我们比较两个值是否相等一般都是使用==
,===
,如有在比较对象的时候,会遍历这个对象的key
,然后拿到key
所对应的value
,然后去比较两个对象key
所对应的value
是否相等。 数组也是同样道理,遍历比较就可了。
- 例如:
javascript
const obj = {key:1, value:1}
const obj1 = {key:1, value:1}
obj === obj1 // fasle
isEqual(obj, obj1) // true,因为虽然对象的引用地址不同,但是对象key所对应的value是相同的。
const isEquals = (obj, otherObj) => {
for(let key in obj){
if(key in otherObj){
return obj[key] === otherObj[key]
} else {
return false
}
}
for(let key in otherObj){
if(key in obj){
return obj[key] === otherObj[key]
}else {
return false
}
}
return true
}
上面我们实现了一个简单的isEquals
方法,我们只对对象的一层进行比较。如果让我们实现一个对象深层次的比较,该如实现呢?
实现
有这样两个深层次的对象,如下:
css
const obj1 = {
key:1,
name:"jack",
value: { name: 'jack', value: 1},
arr: [1, 2, 3],
innerArr: [1,2, { name: 'tom', value: 1 }]
}
const obj2 = {
key:1,
name:"jack",
value: { name: 'jack', value: 1},
arr: [1, 2, 3],
innerArr: [1,2, { name: 'tom', value: 1 }]
}
const obj3 = {
key:1,
name:"jack",
value: { name: 'jack', value: 2},
arr: [1, 2, 3],
innerArr: [1,2, { name: 'tom', value: 3 }]
}
- 上面三个对象,
obj1
和obj2
是相同的,obj1
和obj3
的value
和innerArr[2].value是不同的
- 所以
isEquals(obj1, obj2) === true
,isEquals(obj1, obj3) === false
实现
我们还是沿用上面写的isEquals
,只不过在比较的时候,如果发现两个不相等,那么我们只需要递归调用就可以了,然后在添加下处理基本数据类型的条件就可以啦。实现如下:
vbnet
const isEqusls = (obj, otherObj) => {
// 如果是 null 或 undefined,在这里判断
if (obj == null || otherObj == null) {
return obj === otherObj
}
// number boolean function string 在这里判断
if (typeof obj !== 'object' || typeof otherObj !== 'object') {
return obj === otherObj
}
// 如果是引用数据类型,那么遍历进行比较
for (let key in obj) {
if (!(key in otherObj)) {
return false
}
}
for (let key in otherObj) {
if (!(key in otherObj)) {
return false
}
const value = obj[key]
const otherValue = otherObj[key]
if (value !== otherValue) {
// 如果递归的时候返回了 false , 那么我们 return false,
// 如果返回时 true, 那么那么继续遍历比较
let flag = isEqusl(value, otherValue)
if(!flag) return false
}
}
return true
}