作为开发员,很多时候拿到数据之后都是要做数据判断,比较特别的情况就是我们需要做数组判断和对象判断,经常的我们就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. 03机器学习实战之决策树CART算法

    CART生成 CART假设决策树是二叉树,内部结点特征的取值为“是”和“否”,左分支是取值为“是”的分支,右分支是取值为“否”的分支.这样的决策树等价于递归地二分每个特征,将输入空间即特征空间划分为有 ...

  2. python 执行oracle、python脚本文件

    import os # sql脚本结尾加';'!!! os.system('sqlplus.exe scott/s123@127.0.0.1:1521/ORCL @D:/PycharmProjects ...

  3. ffmpeg-4.1.1-win64-dev在vs2017的搭建

    没得话讲,先在官网下载对应的源码,下载dev/文件夹下的源码和静态链接库  ,下载/shared文件夹下的动态链接库 官网地址:https://ffmpeg.zeranoe.com/builds/wi ...

  4. 【DevExpress】邮箱制作小结

    利用DevExpress的RichEditControl控件可以发送包含图片的邮件.但存在一个问题.RichEdit直接将图片解析成base64码包含在RichEdit的HtmlText中,这导致客户 ...

  5. Azure CosmosDB (9) Unique Key Constraints

    <Windows Azure Platform 系列文章目录> 在Azure Cosmos DB中,还支持Unique Key Constraints(唯一键约束). 我们可以在Azure ...

  6. iOS9.3描述文件怎么安装

    iOS9.3 beta描述文件安装教程:1.复制以下地址:http://bbs.feng.com/plugin.php?id=attachment_download:tongji&aid=11 ...

  7. SpringCloud项目启动报错:NoClassDefFoundError: org/springframework/core/env/EnvironmentCapable

    报错表象: 当启动SpringClud项目报错: Exception in thread "main" java.lang.NoClassDefFoundError: org/sp ...

  8. laravel Faker-1.faker假数据

    1. 安装 composer require fzaninotto/faker --dev 2. 创建 migrations 参考:laravel文档 3. 定义ModelFactory 说明: 默认 ...

  9. php对函数的引用

    function &example($tmp=0){                  //定义一个函数,别忘了加“&”符     return $tmp;              ...

  10. Java子类访问父类的私有成员变量

    /**子类会继承父类所有的属性和方法. * 但是根据不同的权限标识符,子类不可见父类的私有变量,但可以通过父类的公共方法访问私有变量 * 所以对于重名变量,子类和父类都各有一份. * 对于子类和父类中 ...