JavaScript值全等判断
作为开发员,很多时候拿到数据之后都是要做数据判断,比较特别的情况就是我们需要做数组判断和对象判断,经常的我们就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值全等判断的更多相关文章
- JavaScript根据文件名后缀判断是否图片文件
//JavaScript根据文件名后缀判断是否图片文件 //图片文件的后缀名 var imgExt = new Array(".png",".jpg",&quo ...
- 在JavaScript中,如何判断数组是数组?
如果你没有注意过这个问题,那么这个标题应该会让你感到困惑,判断数据类型这么基础的问题能有什么坑呢? 少年,你不能太天真了,我们朝夕面对的这门语言,可是JavaScript呀,任何你觉得已经习以为常的东 ...
- JavaScript 实现全选 / 反选功能
JavaScript 实现全选 / 反选功能 版权声明:未经授权,内容严禁转载! 构建主体界面 编写 HTML 代码 和 CSS 代码,设计主题界面 <style> #user { wid ...
- JavaScript最全编码规范
转载: JavaScript最全编码规范 类型 ●基本类型:访问基本类型时,应该直接操作类型值 ●string ●number ●boolean ●null ●undefined var foo = ...
- ajax返回数据时,如何将javascript值(通常为对象或数组)转为json字符串
ajax获取值时,返回的数据为空时 alert后出现 [ ]; 用if语句判断时不为空,此时如何判断返回的数据是否为空.可将返回的值转化为json字符串. JSON.stringify() 方法用于将 ...
- Javascript实现全选按钮
Javascript实现全选按钮 效果:有全选选项框和单个选项框,选择全选框,所有的的选择都打上的钩,取消全选钩所有的都去掉了钩,如果取消其中某一个的钩,那么全选的钩也取消,反之全选所有的选项,那么全 ...
- [异常解决] MPU6050启动异常读出陀螺仪和加速度计的值全为0的解决办法
在调试一个自己做的手环,每次用keil烧写好程序运行的蓝牙.陀螺仪都是正常的.但是掉电再上电之后蓝牙是好的.陀螺仪可以读出ID但是读出的加速度和角速度数据全为0. 下面是发生问题时main函数的前面部 ...
- PHP javascript 值互相引用(不用刷新页面)
PHP javascript 值互相引用的问题 昨天通过EMAIL给一些公司投了简历,希望他们能给我一份工作,今天其中一家公司的人给我打电话,大意是要我做一点东西(与AJAX有关) 给他们看,我听 ...
- 表单javascript checkbox全选 反选 全不选
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
随机推荐
- 【NOIp2004提高组】食虫算 题解
所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 + 8468#6633 44445509678 其中#号代表被 ...
- Mybatis:resultMap的使用总结
resultMap是Mybatis最强大的元素,它可以将查询到的复杂数据(比如查询到几个表中数据)映射到一个结果集当中. resultMap包含的元素: <!--column不做限制,可以为任意 ...
- C语言 基础
内存的定义 在学习python的时候 了解过内存的管理机制,例如引用计数,垃圾回收,小内存池的概念. 但是并不了解内存究竟是个什么东西?不了解内存的实际存储方式. Mac OS Mojave 处理器 ...
- MySQL常用命令(数据库,表相关的命令)
数据库相关命令 显示数据库列表 mysql> SHOW DATABASES; 创建数据库 mysql> CREATE DATABASE 库名; 如下,创建一个名为crashcours ...
- php商品对比功能代码分享
商品对比调用的JS文件(包含了商品对比框浮动JS): /*浮动窗口*/ (function(){ var n=10; var obj=document.getElementById(&qu ...
- 小程序 iphone X 吸底按钮适配
问题图: 解决方法: // app.js App({ isIphoneX() { let isIphoneX = false wx.getSystemInfo({ su ...
- PHP swoole实现redis订阅和发布
前戏:实现用户下单,服务器通知后台接收订单...类似美团外卖 1.首先要实现一个订阅程序 $result = $client->connect('127.0.0.1', 6379, functi ...
- java练习-判断字符串是否都是数字
方法1: package everyDayPratise; public class IsAllNumber { public static boolean method1(String s) { i ...
- ORACLE 存储过程中保存用户自定义异常信息的一种方式
1.创建错误日志表: create table REP_LOGS ( log_s_no NUMBER not null, log_date DATE default sysdate not null, ...
- Elasticsearch-6.7.0系列(四)Metricbeat仪表盘。本身无端口,依赖kibana
前提 centos7环境 https://www.cnblogs.com/zhuwenjoyce/p/10629320.html elasticsearch搜索引擎 https://w ...