作为开发员,很多时候拿到数据之后都是要做数据判断,比较特别的情况就是我们需要做数组判断和对象判断,经常的我们就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. 【NOIp2004提高组】食虫算 题解

    所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 + 8468#6633 44445509678 其中#号代表被 ...

  2. Mybatis:resultMap的使用总结

    resultMap是Mybatis最强大的元素,它可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中. resultMap包含的元素: <!--column不做限制,可以为任意 ...

  3. C语言 基础

    内存的定义 在学习python的时候 了解过内存的管理机制,例如引用计数,垃圾回收,小内存池的概念. 但是并不了解内存究竟是个什么东西?不了解内存的实际存储方式. Mac OS Mojave 处理器 ...

  4. MySQL常用命令(数据库,表相关的命令)

    数据库相关命令 显示数据库列表 mysql> SHOW  DATABASES; 创建数据库 mysql> CREATE  DATABASE  库名; 如下,创建一个名为crashcours ...

  5. php商品对比功能代码分享

    商品对比调用的JS文件(包含了商品对比框浮动JS): /*浮动窗口*/ (function(){     var n=10;   var obj=document.getElementById(&qu ...

  6. 小程序 iphone X 吸底按钮适配

    问题图: 解决方法: // app.js App({   isIphoneX() {     let isIphoneX = false     wx.getSystemInfo({       su ...

  7. PHP swoole实现redis订阅和发布

    前戏:实现用户下单,服务器通知后台接收订单...类似美团外卖 1.首先要实现一个订阅程序 $result = $client->connect('127.0.0.1', 6379, functi ...

  8. java练习-判断字符串是否都是数字

    方法1: package everyDayPratise; public class IsAllNumber { public static boolean method1(String s) { i ...

  9. ORACLE 存储过程中保存用户自定义异常信息的一种方式

    1.创建错误日志表: create table REP_LOGS ( log_s_no NUMBER not null, log_date DATE default sysdate not null, ...

  10. Elasticsearch-6.7.0系列(四)Metricbeat仪表盘。本身无端口,依赖kibana

    前提 centos7环境 https://www.cnblogs.com/zhuwenjoyce/p/10629320.html         elasticsearch搜索引擎 https://w ...