首页 > 其他分享 >判断对象是否发生变化,常用于监听页面表单是否修改并给出保存提示

判断对象是否发生变化,常用于监听页面表单是否修改并给出保存提示

时间:2023-09-04 11:45:14浏览次数:44  
标签:obj1 obj2 return val 是否 diffRes 表单 old 监听

本文主要封装方法,实现用户离开表单编辑页面时弹出提示框,若表单数据发生变化,则提示用户是否保存当前页面的信息,如图:

 

封装方法:

 1 /**
 2  * 比较俩个对象之间的差异,项目中多处用到监听表单数据是否改动,故封装此方法
 3  * 如果数据改动,则返回新旧对象记录改动字段的新旧值
 4  *
 5  * by wang
 6  * */
 7 export function diffObj(obj1, obj2) {
 8   function getTypeByObj (obj) {
 9     return Object.prototype.toString.call(obj).match(/^\[object ([a-zA-Z]*)\]$/)[1];
10   }
11   function isEmptyObject (obj) {
12     for (let key in obj) {
13       return false;
14     };
15     return true;
16   }
17   if (!obj1 || isEmptyObject(obj1) || !obj2 || isEmptyObject(obj2)) {
18     return null;
19   }
20   let diffRes = {
21     old_val: {},
22     new_val: {}
23   };
24   for (let k in obj2) {
25     // 判断数据类型是否一致
26     if (getTypeByObj(obj2[k]) === getTypeByObj(obj1[k])) {
27       // 比较 “Array”和“Object”类型
28       if (getTypeByObj(obj2[k]) === 'Array' || getTypeByObj(obj2[k]) === 'Object') {
29         const diffData = diffObj(obj1[k], obj2[k]);
30         if (!isEmptyObject(diffData)) {
31           diffRes.old_val[k] = diffData.old_val;
32           diffRes.new_val[k] = diffData.new_val;
33         }
34       } else if (obj1[k] !== obj2[k]) { // 比较其他类型数据
35         diffRes.old_val[k] = obj1[k];
36         diffRes.new_val[k] = obj2[k];
37       }
38     } else {
39       if ([undefined, null, ''].includes(obj1[k]) && [undefined, null, ''].includes(obj2[k])) {
40         // 这三类数据可视为相等,不做处理
41       }else {
42         diffRes.old_val[k] = obj1[k];
43         diffRes.new_val[k] = obj2[k];
44       }
45     }
46   }
47   // 若没有变化,返回null
48   if (isEmptyObject(diffRes.old_val) || isEmptyObject(diffRes.new_val)) {
49     return null;
50   }
51   return diffRes;
52 }

如果返回值为null,则代表没有改变,否则返回改变的属性和值,如图:

 

脚踏实地行,海阔天空飞~

标签:obj1,obj2,return,val,是否,diffRes,表单,old,监听
From: https://www.cnblogs.com/coder--wang/p/17676509.html

相关文章

  • JS判断一个数组中是否有重复值
    方法一:  varary=newArray("111","22","33","111");varnary=ary.sort();for(vari=0;i<ary.length;i++){if(nary[i]==nary[i+1]){alert("数组重复内容:"+nary[i]);......
  • JS判断当前时间是否到时到了某个截止时间
    假设后端接口返回时间2023-01-01为截止时间,需要判断当前时间是否到期逻辑就是将时间转换为时间戳,然后再进行比较。但是注意的是微信小程序iOSgetTime转换成时间戳为null我们只需要将 “-”符号的替换成“/”即可functiongetBirthday(endTime){//将2022-01-0......
  • 9-3|使用Python的scikit-learn库来训练一个逻辑回归模型,检测句子是否含有侮辱性内容:
    当然可以。以下是一个简单的例子,使用Python的`scikit-learn`库来训练一个逻辑回归模型,检测句子是否含有侮辱性内容:```pythonfromsklearn.feature_extraction.textimportTfidfVectorizerfromsklearn.linear_modelimportLogisticRegressionfromsklearn.model_selectionim......
  • Java使用有限状态机算法实现判断字符串是否合法
    题目描述请根据给出的正则表达式来验证邮箱格式是否合法,如果用户输入的格式合法则输出「邮箱格式合法」,否则输出「邮箱格式不合法」。正确格式对应的正则表达式"[a-zA-Z0-9]+@[a-zA-Z0-9]+\.[a-zA-Z0-9]+";输入:[email protected]输出:邮箱格式合法分析最容易想到的是正则表达......
  • 编写判断一个正整数是否为素数的函数
    编写判断一个正整数是否为素数的函数自己搞的,还请斧正。#include <stdio.h>void  prime(int m);                         int main(){    int a[10],i;      for(i=0;i<10;i++)    {        scanf("%d",&a[......
  • elementui 长表单验证滚动到首个错误位置
    this.$refs['form'].validate(valid=>{if(valid){//验证通过}else{//验证失败this.$nextTick(()=>{letisError=document.getElementsByClassName('is-error') isError[0].......
  • Chat Emy的崛起是否会带来大规模失业?
    随着人工智能技术的迅猛发展,聊天型AI模型如ChatEmy正逐渐成为人们日常生活中的伙伴。然而,随之而来的担忧也随之而生:ChatEmy是否将导致大规模失业?ChatEmy作为一种聊天型AI模型,具备强大的自然语言处理能力,能够模拟人类对话,并提供智能回答和解决方案。随着ChatEmy在各领域的应用日......
  • 判断文件夹名称是否为日期格式字符串 判断字符串是否为日期,并且是否早于指定日期
    '''清洗工具-判断文件夹名称是否为日期格式字符串'''#写入函数代码块之前,先加载相应模块,生成相应默认参数#Falseif(x=='')or(xin[None,pd.NaT])or(type(x)!=str)#无论是否指定format,pd.to_datetime(pd.NaT)都输出NaT#无论是否指定format,pd.to_datetime(N......
  • JS 获取form表单的所有数据
    在HTML中用js获取通过GET、POST方法(就是在网址后加?a=b&c=d之类)传过来的表单值。针对大家常用的获取表单方式,很多时候都是在重复的写一些代码,今天给大家贴出来的代码可以作为公用方法直接调用。可以提高大家的开发效率。html<body><formid="login"name="login"......
  • 如何判断身份证是否长期有效(复选框状态)
    initCheckLongTime(){//计算年月letbirthYear=this.prpLpayPerson.identifyNumber?this.prpLpayPerson.identifyNumber.substring(6,10):"";console.log(birthYear,'birthYear');letnowYear......