js中比较两个对象是否相等,模拟lodash的isEqual

本文章主要介绍了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
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值