由于在做键盘导航组件的项目时,有这样一个需求,当用户传入按键字母和网址的映射时,如果和 localStorage 中的不一样那么就用 localStorage 中存储的,这个时候就需要比较两个对象的内容是否相等,但是在 JS 中对象是一种引用类型.

obj1 = {

a: 1

}

obj2 = {

a: 1

}

console.log(obj1 === obj2) // false

即使两个对象的内容完全相同,因为它们的地址不同,因此 obj1 === obj2 会返回 fasle。

所以自己根据深拷贝时递归的思想写了一个比较两个对象之间内容是否相同的函数。

function compareObject (obj1, obj2) {

// 递归终止条件,当 obj1 或 obj2 不是对象时,此时就可以进行判断了

if (typeof obj1 !== 'object' || typeof obj2 !== 'object') {

if (obj1 === obj2) {

return true

} else if (obj1 !== obj2) {

return false

}

}

// 获取对象的自由属性组成的数组

const obj1PropsArr = Object.getOwnPropertyNames(obj1)

const obj2PropsArr = Object.getOwnPropertyNames(obj2)

// 如果数组的长度不相等,那么说明对象属性的个数都不同,返回 false

if (obj1PropsArr.length !== obj2PropsArr.length) {

return false

}

// 记录当前 compareObject 的返回值,默认是 true

let status = true

for (key of obj1PropsArr) {

status = compareObject(obj1[key], obj2[key])

// 关键代码,当 status 为 false 时下面就不用再进行判断了,说明两个对象的内容并不相同

// 如果没有下面这条语句,那么只要对象底层的内容是相同的那么就返回 true

if (!status) {

break

}

}

// 每次 compareObject 执行的返回结果

return status

}

测试代码:

// 判断两个对象的内容相等

const obj1 = {

a: 1,

b: {

c: 2,

d: {

e: 4

}

}

}

const obj2 = {

a: 1,

b: {

c: 2,

d: {

e: 4

}

}

}

console.log(compareObject(obj1, obj2)) // true

// 判断两个对象的内容不相等

const obj1 = {

a: 1,

b: {

c: 2,

d: {

e: 4

}

}

}

const obj2 = {

a: 1,

b: {

c: 2,

d: {

e: 5

}

}

}

console.log(compareObject(obj1, obj2)) // false

接下来再来强调一下 compareObject 函数中第 23 行这句关键代码,如果没有这条语句那么最后的返回结果只会取决于两个对象最底层属性(最后一次)的比较结果。

if (!status) {

break

}

例如,我将两个对象变为下面这样:

const obj1 = {

a: 1,

b: {

c: 3, // 和 obj2 不相等

d: {

e: 4

}

}

}

const obj2 = {

a: 1,

b: {

c: 2,

d: {

e: 4

}

}

}

console.log(compareObject(obj1, obj2)) // true

可以看到最后的返回结果是 true,因为最后的一次比较是 e 属性,它们的值是相等的。

上面这样的写法应该还有一些情况没有考虑到,对于我的项目需求而言已经足够了,如果哪位小伙伴发现了希望可以提出来,然后再将它改进一下,非常感谢。

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[判断两个对象的内容是否相等]http://www.zyiz.net/tech/detail-132346.html

判断两个对象是否相等java_判断两个对象的内容是否相等相关推荐

  1. 用html5交换两个变量的值,Python判断两个对象相等的原理 python交换两个变量的值为什么不用中间变量...

    python语言设计一个类代表花,其中含2个对象属性,2class flower: def __init__ (self, name, shape): self.name = name self.sh ...

  2. 判断两条线段是否相交 java_判断两个线段是否相交02

    写在前面 在其他博客中看到这方面的知识,很多都是重复,并且说的总是云里雾里的,所以这里我就自己总结一下这种问题如何求解,判断两个线段是否相交在前面我们提到了会用到叉积的一点知识,那么这里就来详细说一下 ...

  3. java判断一个对象是否为空_Java中判断对象是否为空的方法的详解

    首先来看一下工具StringUtils的判断方法: 一种是org.apache.commons.lang3包下的: 另一种是org.springframework.util包下的.这两种StringU ...

  4. JavaScript高级day01-AM【WebStrom安装、数据类型分类及判断、数据-内存-变量、引用变量赋值、对象的组成】

    笔记.视频.源码:JavaScript(基础.高级)笔记汇总表[尚硅谷JavaScript全套教程完整版] 目   录 P1 01.尚硅谷_JS高级_准备 07:07 WebStrom 下载及安装 1 ...

  5. python判断对象是否实例化_Python判断对象是否相等及eq函数的讲解

    摘要 什么是python对象的标识 python对象相等的判断 自定义python对象相等的条件 python对象的标识 python对象标识就是python对象自身的要素,python对象主要有3要 ...

  6. vue 对象判断为空_Vue中可用的判断对象是否为空的方法

    vue有两个方法可用 1. JSON.stringify(evtValue)=='{}' 2. Object.keys(xxx).length==0 js判断对象是否为空对象的几种方法 1.将json ...

  7. java判断对象已死_JVM判断对象已死亡?

    设计与实现以jvm为例+高级虚拟机 244.5元 (需用券) 去购买 > 本节常见面试题 如何判断对象是否死亡(两种方法). 简单的介绍一下强引用.软引用.弱引用.虚引用(虚引用与软引用和弱引用 ...

  8. python计算输入的两个数字,try...except...判断是否输入的是数字,如果是则相加

    python计算输入的两个数字,try-except-判断是否输入的是数字,如果是则相加,如果不输入q或者n,则循环一直下去: print("Enter 'q' to quit\n" ...

  9. python判断两线段是否相交_c语言 判断两直线段是否相交

    转了多人的放到一起比较!! //功能:求点在有向直线左边还是右边 //返回:0共线.1左边.-1右边 intleft_right(pointa,pointb,doublex,doubley) { do ...

最新文章

  1. openGL 入门 2--顶点数组对象 VAO 和 缓存对象 VBO
  2. input js 离开事件_听说你熟练使用Vue.js,这9种Vue技术你掌握了吗?
  3. 一个 NAND flash写函数
  4. 玩转NumPy——split()函数使用详解
  5. [Mysql]查看版本号的五种方式
  6. “理想智造”品牌首次面世 新造车势力车和家正式上场
  7. 【unity3d游戏开发之基础篇】利用射线实现鼠标控制角色转向和移动(角色移动一)...
  8. pyQt显示系统文件目录
  9. 大型分布式Java项目--宜立方商城
  10. mysql 日期格式化_每天一个常用MySQL函数-from_unixtime等
  11. 【2020年“科创中国”】先导技术榜单、新锐企业榜单、产学研融通组织榜单发
  12. YDOOK: Python:requests: Scanic: 客户端 client 向服务器请求照片并返回 post请求
  13. 电驴 链接不到服务器
  14. FPGA采集AD7606串行输源码加讲解
  15. 打开计算机管理窗口命令,Win7如何打开命令行窗口?打开命令行窗口的方法
  16. 防止360浏览器小窗下载视频
  17. 海量数据去重之SimHash算法简介和应用
  18. boox android 4.4,纷极阅读app
  19. 瑞萨e2studio(8)----PWM
  20. 亿万富翁神奇公式:年存1.4万四十年变1亿

热门文章

  1. dw超链接标签_小花园DW学习笔记
  2. C语言怎么开辟超大内存?(malloc)
  3. Linux下VSCode的安装和使用(VScode C/C++配置 CMake的使用)(GCC、GDB)(各类插件 Snippets、Code Runner、Include Autocomplete)
  4. 什么是序列化?python pickle模块
  5. php测试框架,PHPUnit使用
  6. python 只取数值_快收藏!Python常用操作运算符,都在这了!(下)
  7. CentOS7虚拟机之间设置免密登录
  8. python构建区块链_用python构建区块链(1)---基本结构
  9. 8-Qt6 智能指针QPointer
  10. QT vs下x64编译变win32编译报错:C:\Users\ycy\AppData\Local\QtMsBuild\qtrcc.targets(69,5): error MSB3073: