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

本文介绍JavaScript中比较两个对象是否相同的几种方法,包括常规比较及原生JS实现的深入比较方式。通过对不同对象结构的对比,展示如何判断复杂对象是否相等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文章主要介绍了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
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值