js实现一个深比较 isEquals

前沿

在前端我们比较两个值是否相等一般都是使用==,===,如有在比较对象的时候,会遍历这个对象的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 }]
}
  • 上面三个对象,obj1obj2是相同的,obj1obj3valueinnerArr[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
}
相关推荐
知否技术8 分钟前
别再踩坑了!这份 Vue3+TypeScript 项目教程,赶紧收藏!
前端·typescript
IT_陈寒11 分钟前
JavaScript 2024:10个颠覆你认知的ES新特性实战解析
前端·人工智能·后端
ホロHoro14 分钟前
学习笔记:Javascript(5)——事件监听(用户交互)
javascript·笔记·学习
meng半颗糖21 分钟前
JavaScript 性能优化实战指南
前端·javascript·servlet·性能优化
EndingCoder22 分钟前
离线应用开发:Service Worker 与缓存
前端·javascript·缓存·性能优化·electron·前端框架
遗憾随她而去.34 分钟前
css3的 --自定义属性, 变量
前端·css·css3
haogexiaole3 小时前
vue知识点总结
前端·javascript·vue.js
哆啦A梦15885 小时前
[前台小程序] 01 项目初始化
前端·vue.js·uni-app
智码看视界6 小时前
老梁聊全栈系列:(阶段一)架构思维与全局观
java·javascript·架构
小周同学@7 小时前
谈谈对this的理解
开发语言·前端·javascript