前端小技巧: 实现一个比较两个对象是否相等的方法

思路

  • 实现两个对象的深度比较,模拟 lodash.isEqual() 写出一个简单的方案
  • 地址不一样,属性一样,判定相等

要求

基于以下示例,来判定是否相等

// obj1 和 job2 完全一致
const obj1 = {a:10, b: {x: 100, y: 200}};
const obj2 = {a:10, b: {x: 100, y: 200}};console.log(isEqual(obj1, obj2)// true

isEqual() 实现

// 判断是否是对象或数组
function isObject(obj) {return obj && (typeof obj === 'object');
}// 全相等(深度)
function isEqual(obj1, obj2) {// 值类型(注意,参与 equal 的一般不会是函数)函数不考虑if (!isObject(obj1) || !isObject(obj2)) return obj1 === obj2;// 允许 obj1 === obj1的情况if (obj1 === obj2) return true;// 两个都是对象或数组,而且不相等// 1. 先取出 obj1 和 obj2 的 keys ,比较个数const obj1Keys = Object.keys(obj1);const obj2Keys = Object.keys(obj2);// 属性个数不同,不全等,包括数组if (obj1Keys.length !== obj2Keys.length) return false;// 2. 遍历来进行比较,记录最终的 boolean 变量let flag = true; // 默认为trueconst keys = Object.keys(obj1);keys.some((key) => {// 以 obj1 为基准,和 obj2 一次递归比较const flag = isEqual(obj1[key], obj2[key]);if (!flag) {flag = false;return true;}})// 3. 返回 flagreturn flag;
}
  • 对于对象属性的处理,递归是一个非常好的方式
  • 对属性的遍历 Object.keys 不会访问原型链上的属性
    • 如需处理原型链上的东西,请使用 for - in 替代
    • 一般而言,不需要处理原型链的对比, 这样会提升性能

代码测试


// 测试
const obj1 = { a: 100,  b: {x:  100, y: 200 } };
const obj2 = { a: 100,  b: {x:  100, y: 200 } };console.log( obj1 === obj2 ) // false
console.log( isEqual(obj1, obj2) ) // trueconst arr1 = [1, 2, 3, 4, [5, [6, 7]]];
const arr2 = [1, 2, 3, 4, [5, [6, 7]]];
console.log(arr1 === arr2); // false
console.log( isEqual(arr1, arr2) ) // true

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/205166.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Liunx Centos 防火墙操作

liunx centos 防火墙 查看防火墙状态 systemctl status firewalld查看已经开放的端口 firewall-cmd --list-ports添加端口3306 firewall-cmd --zonepublic --add-port3306/tcp --permanent重启防火墙 firewall-cmd --reload数据库开放账号可以外网登陆 mysql -u root -p …

剑指 Offer(第2版)面试题 27:二叉树的镜像

剑指 Offer(第2版)面试题 27:二叉树的镜像 剑指 Offer(第2版)面试题 27:二叉树的镜像解法1:递归 剑指 Offer(第2版)面试题 27:二叉树的镜像 题目来源&#x…

JavaSE语法之五:数组的定义与使用(超详解!!!)

文章目录 一、数组的概念1. 什么是数组2. 数组的创建及初始化3. 数组的使用3.1 数组中元素的访问3.2 遍历数组 二、数组是引用类型1. 初始JVM的内存分布2. 基本类型变量与引用变量的区别3. 引用变量4. 认识null 三、数组的应用场景1. 保存数据2. 作为函数的参数2.1 参数传基本类…

Cheat Engine修改器检测方案

在游戏安全对抗过程中,有不少外挂的实现基于对游戏内存模块进行修改,这类外挂通常会使用「内存修改器」。 据FairGuard游戏安全数据统计,在游戏面临的众多安全风险中,修改器的占比高达16% 。如此高的占比,修改器的危害…

血糖仪_智能便携式血糖检测仪定制_基于联发科MTK8788血糖仪方案

糖尿病早期通常没有明显的症状,因此很难自己意识到自己已经进入高血糖状态。而且,到医院进行检查需要挂号、门诊和排队等步骤,不仅费时费力,对于父母来说,频繁去医院检查是不现实的,也不舍得这样做。因此&a…

MySql数据库优化的八种方式

本文通过8个方法优化Mysql数据库&#xff1a;创建索引、复合索引、索引不会包含有NULL值的列、使用短索引、排序的索引问题、like语句操作、不要在列上进行运算、不使用NOT IN和<>操作。 1、创建索引 对于查询占主要的应用来说&#xff0c;索引显得尤为重要。很多时候性…

maven-assembly-plugin 自定义打包

我想把input文件夹给打包进去 pom文件 <build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-assembly-plugin</artifactId><executions><execution><!-- 配置执行器 --><i…

将jpg图片和txt标签文件重新命名

处理文件夹里面jpg图片的名字 将文件夹里面的jpg图片重新命名 import osdirectory C:\\Users\\23608\\Desktop\\Luli_work\\data\\fanStudent\\dataset i 1 for file in os.listdir(directory):if file.endswith(.jpg):old_name os.path.basename(file).split(.)[0]new_na…

vue2 百度地图实现 车在线路上移动 BMap、BMapGL

文章目录 效果BMap 实现vue2 中BMap实现vue2 中使用BMapGL实现 参考文章&#xff1a; 百度地图API实时画出动态运行轨迹&#xff08;一条行驶轨迹&#xff09;&#xff0c;车头实时指向行驶方向&#xff0c;设置角度偏移 下文中可能用到的图片统一放在上面&#xff0c;自取。 …

Halcon threshold_sub_pix (Operator)

read_image(Image,fabrik) threshold_sub_pix(Image,Border,35) dev_display(Border)Image是输入的原始图像&#xff0c;Threshold是设定的阈值&#xff0c;Width和Height是像素值计算区域的大小&#xff0c;ThresholdedRegion是经过分割后得到的二值化结果。 在对图像进行二值…

深眸科技以机器视觉高性能优势,为消费电子行业提供优质解决方案

机器视觉技术近年来发展迅速&#xff0c;基于计算机对图像的处理与分析&#xff0c;能够识别和辨别目标物体&#xff0c;被广泛应用于人工智能、智能制造等领域。 机器视觉凭借着高精度、高效率、灵活性和可靠性等优势&#xff0c;不断推进工业企业生产自动化和智能化进程&…

返回值的作用,用法

函数返回值 定义&#xff1a;函数的返回值是指函数被调用之后&#xff0c;执行函数体中的代码所得到的结果&#xff0c;这个结果通过return语句返回。 返回值的类型必须与函数定义类型一致 return用法 return 语句的一般形式为&#xff1a; …

Anaconda安装教程及多次安装失败原因

Anaconda下载网址 本教程包含两部分&#xff1a;安装教程和多次安装Anaconda导致的失败原因分析 Anaconda安装包官网下载链接 ![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b5be0deb0aef4a81a594df79ddc1cc96.png#pic_center 安装 按以下步骤安装 红色波浪…

【洛谷随机挑战系列】第一期:徒手计算质数表,你敢相信?

目录 前言 准备环节 随机程序公示 随机结果公示 ​编辑做题环节 解读题目 思路点拨 AC代码

UEC++ 探索虚幻5笔记 day11

虚幻5.2.1探索 项目目录探索 C工程一定不能是中文路径&#xff0c;中文项目名&#xff0c;最好全部不要用中文&#xff0c;蓝图项目可以是中文浅浅创建一个空项目&#xff0c;讲解一下之前UE4没有讲解的项目目录文件的分布组成 .vs&#xff1a;文件夹一般是项目编译缓存文件夹…

一维相位解包裹

一维相位解包裹 本文首先介绍最简单的一维的位相解包裹算法。设W是包裹运算符&#xff0c;中是解包裹位相&#xff0c;是包裹的位相。则一维位相解包裹可表示为&#xff1a; 解包裹就是要选取正确的k,满足&#xff1a; 两个相邻像素位相的差值如下&#xff1a; 由式(2-1)和式(2…

C语言——2048完整版

2048是一个简单又有趣的小游戏&#xff0c;相信大家都接触并了解过&#xff0c;那如何通过代码来实现他呢&#xff1f;下面就让我们来一起看看。 目录 1、头文件 2、主函数 3、 StarGame 4、GetNum 5、Show 6、Picture 7、GetButton 8、MergeLeft 9、MergeUp 10、MergeR…

ESP32 S3+3线SPI+HX8347

HX8347 240*320 TFT屏 3线SPI&#xff08;CS,SCL,SDI&#xff09;用ESP32 S3驱动 一、源码 /* SPI Master exampleThis example code is in the Public Domain (or CC0 licensed, at your option.)Unless required by applicable law or agreed to in writing, thissoftware i…

基于下游竞争的在线评论引入策略研究

基于下游竞争的在线评论引入策略研究 分析一下这篇文章吧 中国管理科学的2023年10月的文章&#xff0c;非常新 文章的结论 引入在线评论会使得线下零售商在持续销售阶段降价&#xff0c;线上零售商在持续销售阶段提价&#xff0c;从而使得线上线下零售商的价格差异增大&…

Python 作业解答

1. 在给定的一些数字中找出2个数&#xff0c;使得它们的和为N 题目要求 如给定5个数字 [3&#xff0c;4&#xff0c;9&#xff0c;7&#xff0c;10] 从中选择两个数使用它们的和为11。必须保证这些数据中有答案&#xff0c;并且只有一个答案。 1.1 解题思路一&#xff1a;双…