JS对比两个对象键值全等
比较两个对象的键值是否全等,说的就是字面上的相等,也就是看起来的一模一样的,举个栗子
let o1 = { let o2 = {name: 'joe', name: 'joe' isOld: false, isOld: false,age: 24, age: 24,blank: null, blank: null,what: undefined, what: undefined,fun: function() { fun: function() {return 'test'; return 'test';}, },strange: NaN, strange: NaN,newType: Symbol('symbol') newType: Symbol('symbol')} }
上面这两个对象你说相等不相等,肯定不相等,但是键值是否全等,那的确就是全等的,我们就是要写个函数来检查两个函数是否键值全等 (键的顺序是不分的),那我们就来理清一下写这个函数的思路:
我们肯定是要遍历键去对比,所以我们先保证长度是一致的
1. 获取两个对象的键数组,然后对比长度
2. 不同得类型的属性你得用不同得方法判断属性值是否相等,这里并不是指基本类型,而是我们要做不同方法判断时候分成4种
- Number , Boolean, String, Null, Undefined 这5种基本类型我们可以直接对比,
Object.is(params1, params2); // 为什么不用 ===, 因为Number类型会有NaN
- Symbol和Function,这种基本类型我们直接对比不了,只能转为字符串对比
(String(params1) === String(params2)) // 为什么不用toString(), 因为Function没有toString()
- Object,这个我们无法直接对比,因为你不知道它里面还包含多少的东西,所以这个要递归分解成其他的数据类型在对比,后面就是用
递归
来解决Object的对比 - ,函数这个就比较特殊了,这个只能是转成字符串去对比一下
(String(function() {let aa= 1}) === String(function() {let aa= 1}))
3. 我们还要知道怎么去判断值是属于哪种类型,我们就使用 typeof
去判断,对于null
值,typeof
会返回 object
,所以如果是object
类型还要判断一下是否是恒等于null
if (typeof val === 'object' && val !== null) // 这是object类型了if (typeof val === 'symbol') // Symbol类型if (typeof val === 'function') // Function类型else // 剩下得类型就是 Number , Boolean, String, Null, Undefined
好了说了一大堆,我们要开始写代码了,还有记住es6获取所有键得方法,Object.keys()会返回一个键得数组
,上代码
/*** @Description 比较两个对象键值全等* @author joe* @date 2020-11-15 14:59:03* @param {Object} objOne 对象1* @param {Object} objTwo 对象2* @return {Boolean} 是否键值全等**/function objKeyValueIsSame(objOne, objTwo) {let keysOne = Object.keys(objOne); // 获取对象1所有键数组let keysTwo = Object.keys(objTwo); // 获取对象1所有键数组if (keysOne.length !== keysTwo.length) return false; // 对比一下键得长度是否相等,如果不等则直接返回true// 开始遍历键去获取对象值对比,我们思路是值不匹配则返回false,但是如果匹配则则什么都不要,继续循环,直到循环结束,没有返回false就行了for (let key of keysOne) {if (typeof objOne[key] === 'object' && objOne[key] !== null) { // 如果是对象,则再递归对比,如果递归返回false,则直接方法也直接返回falseif (!objKeyValueIsSame(objOne[key], objTwo[key])) return false;} else if (typeof objOne[key] === 'function' || typeof objOne[key] === 'symbol') { // 如果是function或symbol,转字符串再对比,不匹配则直接返回falseif (String(objOne[key]) !== String(objTwo[key])) return false;} else { // 最后其他类型用es6得Object.is()来比较,不匹配直接返回falseif (!Object.is(objOne[key], objTwo[key])) return false;}}return true; // 遍历结束了没有返回false,说明没有问题,这里直接返回true,表示键值全等了}let aa = {age: 24,blank: null,what: undefined,fun: function () {return 'test';},strange: NaN,newType: Symbol('symbol')}let bb = {age: 24,blank: null,what: undefined,fun: function () {return 'test';},strange: NaN,newType: Symbol('symbol')}console.log(objKeyValueIsSame(aa, bb))
上面得代码两个重点
- 你得明白递归
- 思路是如果遍历时候有不匹配就返回false直接结束整个函数,但是匹配得不要返回true,因为遍历的时候你不知道有没有遍历完,所以再for循环下面再返回ture
总结
最后总结一下,你要知道一个object里面的属性可以有多少种类型,然后每种类型应该用什么的对比方法
JS对比两个对象键值全等相关推荐
- js比较两个对象数组是否相同
1.js 比较两个对象数组是否完全相同 let obj1 = [{"id" : 1, "name" : "xiaoMing"}]; let ...
- 前端 项目中 判断两个对象value值是否相等
项目中的实例 看上图知道,点击了支付时,验证了选中行的主体信息,不一致就给提示信息,一致就出现弹框(这里弹框没有写) 那么我们就要在循环遍历的基础上,判断选中的行信息的 某个值是否相等. 也就是 判断 ...
- js中两个对象的比较
代码取自于underscore.js 1.8.3的isEqual函数. 做了一些小小的修改,主要是Function的比较修改. 自己也加了一些代码解读. <!DOCTYPE html> & ...
- js (查重)键值对数组(一维数组),并归类计数
js (查重)键值对数组(一维数组),并归类计数 全部代码 · 示例如下: 仅作为demo演示 <!DOCTYPE html> <html><head><me ...
- vue 判断两对象是否一致_判断两个对象的值是否相等
判断两个对象的值是否相等 源代码 function isEqual (a, b) { const classNameA = toString.call(a) const classNameB = to ...
- 对比两张图片的MD5值
图片上传的时候,通过对比两张图片的MD5值,判断图片是否上传成功. package com.kedacom.testdemo.javaTest;import java.io.File; import ...
- JAVA杂谈 —— 1.2 JS比较两个对象内容是否相同
JS比较两个对象内容是否相同 -- JAVA 欢迎观看本博客 题目详情 欢迎观看本博客 您好! 这是我编程上遇到的困惑,现在记录下来.如有疏漏与不足之处还请多多指教. 题目详情 在实际开发中, ...
- js比较两个对象是否相同的函数
js比较两个对象是否相同的函数 很多时候需要比较两个对象,来判断是否可以提交表单等操作,此时就需要比较两个对象是否相同,参考其他人的方法,自己写了以下函数来比较两个对象 /*** 两个对象比较* @p ...
- Java中对比两个对象中属性值[反射、注解]
在Java中通常要比较两个对象在修改前与修改后的值是否相同,一般我们采用的是反射技术获取对象的get方法[或其他的方法]获取值并做比较.如果系统将修改的属性名称也显示出来,这样就能更直观的显示类中的哪 ...
最新文章
- 分布式系统唯一ID生成方案汇总【转】
- python要学多久-零基础python培训需要学多久?
- Linux必学60个命令文件处理
- React中使用setState
- mysql触发器查询别的表_Oracle触发器查询统计本表
- git 获取最新代码_常用命令之git操作(入门篇)
- Web前端进阶之JavaScript模块化编程知识
- JDK 12:实际中的切换语句/表达式
- mysql bitmap index_[MySQL] mysql中bitmap的简单运用
- Python中dataframe数据框中选择某一列非空的行
- 俞敏洪回应新东方股价跌破1美元
- Mybatis-Plus条件构造器
- 求职面试准备——自我介绍
- 拼多多玩出花的社交电商 你知道多少?四川海昇智深度解析来啦
- python360安全浏览器_使用python3.7 的pycharm selenium自动化测试中启动360浏览器、360极速浏览器的方法...
- 程序员的算法趣题Q67: 不挨着坐是一种礼节吗?
- Illustrator “图像裁切”功能如何使用?
- oracle sql语句加速选项,Oracle SQL优化基本步骤
- 通过展频降低系统EMI
- 就凭这些,蕴含清华百年历史的《无问西东》唤起了一片赤子之心