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
}
相关推荐
转角羊儿5 分钟前
uni-app文章列表制作⑧
前端·javascript·uni-app
大G哥12 分钟前
python 数据类型----可变数据类型
linux·服务器·开发语言·前端·python
hong_zc36 分钟前
初始 html
前端·html
小小吱41 分钟前
HTML动画
前端·html
Bio Coder1 小时前
学习用 Javascript、HTML、CSS 以及 Node.js 开发一个 uTools 插件,学习计划及其周期
javascript·学习·html·开发·utools
糊涂涂是个小盆友1 小时前
前端 - 使用uniapp+vue搭建前端项目(app端)
前端·vue.js·uni-app
浮华似水1 小时前
Javascirpt时区——脱坑指南
前端
王二端茶倒水1 小时前
大龄程序员兼职跑外卖第五周之亲身感悟
前端·后端·程序员
_oP_i2 小时前
Web 与 Unity 之间的交互
前端·unity·交互
钢铁小狗侠2 小时前
前端(1)——快速入门HTML
前端·html