作为开发员,很多时候拿到数据之后都是要做数据判断,比较特别的情况就是我们需要做数组判断和对象判断,经常的我们就array === array ,object === object;但是可惜是我们得到的结果是false,可是明明属性名和值都是一样的,为什么就返回false。那是因为这两个压根就是不是同一个数组或者同一个对象,怎么理解呢,就是两个人有着同样的外貌,同样的性格等等,但是他们不是同一个人。其实我们之所以要匹配数组对象是否全等,我们也仅仅是想看他们里面的内容是否是一样,那么我就只需要判断他们的内容是否是一样就行了。

  由于对象和数组并不能用全等判断,需要对里面的值进行判断,因此我们就需要判断当我们遇到数组和对象时,另外进行判断。如果我们遇到了对象,我们就判断对象长度是否一致,如果对象长度一致后,我们就往下判断,每一个属性名,如果都一样,就判断值一不一样,如果这三步都是一样的,那就代表这一个对象是一样的。数组也同理,对每个值进行判断。当然特殊的情况,就是数组对象,或者对象包含数组,因此我们再深层的去判断,所以我们会形成递归函数。

一.数值全等匹配

    /*
* 数值全等匹配
* @params data1:匹配数据1
* @params data2:匹配数据2
* */
function equal(data1,data2){
if(data1.constructor === data2.constructor){
switch (data1.constructor){
case Object:{
if(!ObjectEqual(data1,data2)){
return false;
}
break;
}
case Array:{
if (!ArrayEqual(data1, data2)) {
return false;
}
break;
}
default:{
if (data1 !== data2) {
return false;
}
}
}
return true;
}else{
return false;
}
};

数组全等

    /*
* 数组全等匹配
* */
function ArrayEqual(array1, array2) {
if (array1.length === array2.length) {
for (let i in array1) {
if (array1[i].constructor === array2[i].constructor) {
switch (array1[i].constructor) {
case Object: {
if (!ObjectEqual(array1[i], array2[i])) {
return false
}
break;
}
case Array: {
if (!ArrayEqual(array1[i], array2[i])) {
return false;
}
break;
}
default: {
if (array1[i] !== array2[i]) {
return false;
}
break;
}
}
} else {
return false;
}
}
return true;
} else {
return false
}
}

对象全等

    /*
* 对象全等匹配
* */
function ObjectEqual(object1, object2) {
let aProps = Object.getOwnPropertyNames(object1);
let bProps = Object.getOwnPropertyNames(object2);
if (aProps.length === bProps.length) {
for (let i in aProps) {
if (aProps[i] !== bProps[i] || object1[aProps[i]].constructor !== object2[bProps[i]].constructor) {
return false;
} else {
switch (object1[aProps[i]].constructor) {
case Object: {
if (!ObjectEqual(object1[aProps[i]], object2[bProps[i]])) {
return false
}
break;
}
case Array: {
if (!ArrayEqual(object1[aProps[i]], object2[bProps[i]])) {
return false;
}
break;
}
default: {
if (object1[aProps[i]] !== object2[bProps[i]]) {
return false;
}
break;
}
}
}
}
return true;
} else {
return false;
}
}

  

JavaScript值全等判断的更多相关文章

  1. JavaScript根据文件名后缀判断是否图片文件

    //JavaScript根据文件名后缀判断是否图片文件 //图片文件的后缀名 var imgExt = new Array(".png",".jpg",&quo ...

  2. 在JavaScript中,如何判断数组是数组?

    如果你没有注意过这个问题,那么这个标题应该会让你感到困惑,判断数据类型这么基础的问题能有什么坑呢? 少年,你不能太天真了,我们朝夕面对的这门语言,可是JavaScript呀,任何你觉得已经习以为常的东 ...

  3. JavaScript 实现全选 / 反选功能

    JavaScript 实现全选 / 反选功能 版权声明:未经授权,内容严禁转载! 构建主体界面 编写 HTML 代码 和 CSS 代码,设计主题界面 <style> #user { wid ...

  4. JavaScript最全编码规范

    转载: JavaScript最全编码规范 类型 ●基本类型:访问基本类型时,应该直接操作类型值 ●string ●number ●boolean ●null ●undefined var foo = ...

  5. ajax返回数据时,如何将javascript值(通常为对象或数组)转为json字符串

    ajax获取值时,返回的数据为空时 alert后出现 [ ]; 用if语句判断时不为空,此时如何判断返回的数据是否为空.可将返回的值转化为json字符串. JSON.stringify() 方法用于将 ...

  6. Javascript实现全选按钮

    Javascript实现全选按钮 效果:有全选选项框和单个选项框,选择全选框,所有的的选择都打上的钩,取消全选钩所有的都去掉了钩,如果取消其中某一个的钩,那么全选的钩也取消,反之全选所有的选项,那么全 ...

  7. [异常解决] MPU6050启动异常读出陀螺仪和加速度计的值全为0的解决办法

    在调试一个自己做的手环,每次用keil烧写好程序运行的蓝牙.陀螺仪都是正常的.但是掉电再上电之后蓝牙是好的.陀螺仪可以读出ID但是读出的加速度和角速度数据全为0. 下面是发生问题时main函数的前面部 ...

  8. PHP javascript 值互相引用(不用刷新页面)

    PHP javascript 值互相引用的问题   昨天通过EMAIL给一些公司投了简历,希望他们能给我一份工作,今天其中一家公司的人给我打电话,大意是要我做一点东西(与AJAX有关) 给他们看,我听 ...

  9. 表单javascript checkbox全选 反选 全不选

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...

随机推荐

  1. tab页的使用方法

    css代码: #main{ margin:0px; width:100%; height:540px; background:url(m.jpg) no-repeat; background-size ...

  2. python之 自动补全 tab

    1.在python中运行命令sys.path查看python路径 >>> import sys>>> import tabTraceback (most recen ...

  3. springmvc的dispatchservlet初始化

    初始化做的事情,处理下controller的映射关系 https://blog.csdn.net/qq_38410730/article/details/79426673

  4. layui layui.open弹窗后按enter键不停弹窗问题的解决

    问题描述:layui.open弹窗后,点击enter键会不停弹窗,背景颜色变得越来越深 解决办法:1.使用回调函数让按钮失去焦点 var info = layer.open({ type: 2 , t ...

  5. Linux updatedb命令详解

    Linux updatedb命令 updatedb 命令用来创建或更新 locate 命令所必需的数据库文件. updatedb 命令的执行过程较长,因为在执行时它会遍历整个系统的目录树,并将所有的文 ...

  6. linux 管道通信

    下面举linux下有名管道通信的代码. ----------------------------------------- fifo_read.c =========== #include<er ...

  7. 一种C语言实现面向对象特性的继承,多态

    基类: //.h typedef int (*TELE_SEND_CB)(char *pdata, int len); //函数表结构 typedef struct tele_pro_base_vtb ...

  8. Docker安装使用battery historian

    apt-get insatll docker.io battery historian ubuntu下使用 首先要确保是google浏览器,然后用命令行 google-chrome --proxy-s ...

  9. css 优化

    // 注: 以下内容大量借阅自<<Webkit技术内幕>>--朱永盛(14年出版的) , 很多内容可能早已更新 , 因此个人并不能确定论述是否正确.部分摘录内容有删减 , 目录 ...

  10. 如何限制指定textFiled第三方输入法切换

    在有些项目中需要用到输入纯数字的键盘,并且还不能切换到第三方输入法! textFiled.secureTextEntry = YES; [textFiled addTarget:self action ...