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

news2024/11/21 0:22:19

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

封装方法:

/**
 * 比较俩个对象之间的差异,项目中多处用到监听表单数据是否改动,故封装此方法
 * 如果数据改动,则返回新旧对象记录改动字段的新旧值
 *
 * by wang
 * */
export function diffObj(obj1, obj2) {
  function getTypeByObj (obj) {
    return Object.prototype.toString.call(obj).match(/^\[object ([a-zA-Z]*)\]$/)[1];
  }
  function isEmptyObject (obj) {
    for (let key in obj) {
      return false;
    };
    return true;
  }
  if (!obj1 || isEmptyObject(obj1) || !obj2 || isEmptyObject(obj2)) {
    return null;
  }
  let diffRes = {
    old_val: {},
    new_val: {}
  };
  for (let k in obj2) {
    // 判断数据类型是否一致
    if (getTypeByObj(obj2[k]) === getTypeByObj(obj1[k])) {
      // 比较 “Array”和“Object”类型
      if (getTypeByObj(obj2[k]) === 'Array' || getTypeByObj(obj2[k]) === 'Object') {
        const diffData = diffObj(obj1[k], obj2[k]);
        if (!isEmptyObject(diffData)) {
          diffRes.old_val[k] = diffData.old_val;
          diffRes.new_val[k] = diffData.new_val;
        }
      } else if (obj1[k] !== obj2[k]) { // 比较其他类型数据
        diffRes.old_val[k] = obj1[k];
        diffRes.new_val[k] = obj2[k];
      }
    } else {
      if ([undefined, null, ''].includes(obj1[k]) && [undefined, null, ''].includes(obj2[k])) {
        // 这三类数据可视为相等,不做处理
      }else {
        diffRes.old_val[k] = obj1[k];
        diffRes.new_val[k] = obj2[k];
      }
    }
  }
  // 若没有变化,返回null
  if (isEmptyObject(diffRes.old_val) || isEmptyObject(diffRes.new_val)) {
    return null;
  }
  return diffRes;
}

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/971206.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一文入门Web网站安全测试

文章目录 Web网页安全风险评估1. 数据泄漏2. 恶意软件传播3. 身份伪装和欺诈 测试Web网页的安全性常见方法和工具漏洞扫描器手动漏洞测试漏洞利用工具Web应用程序防火墙(WAF)测试渗透测试代码审查社会工程学测试 推荐阅读 Web网页安全风险评估 越来越多…

L1-058 6翻了(Python实现) 测试点全过

前言: {\color{Blue}前言:} 前言: 本系列题使用的是,“PTA中的团体程序设计天梯赛——练习集”的题库,难度有L1、L2、L3三个等级,分别对应团体程序设计天梯赛的三个难度。更新取决于题目的难度,…

ROS通信机制之动作(Action)服务的实践

1、动作概述 讲完了 服务 之后,接下来就是通信的第三种机制,动作。在上节我们知道服务的应用场景是需要在有限时间内完成,而对于一些比较复杂的任务,需要耗时比较长,甚至是不确定时间的时候,就需要用到动作…

20.添加HTTP模块

添加一个简单的静态HTTP。 这里默认读者是熟悉http协议的。 来看看http请求Request的例子 客户端发送一个HTTP请求到服务器的请求消息,其包括:请求行、请求头部、空行、请求数据。 HTTP之响应消息Response 服务器接收并处理客户端发过来的请求后会返…

尚硅谷SpringMVC (9-13)

九、HttpMessageConverter HttpMessageConverter ,报文信息转换器,将请求报文转换为 Java 对象,或将 Java 对象转换为响应报文 HttpMessageConverter提供了两个注解和两个类型: RequestBody , ResponseBody &#xff…

如何创建美观的邮件模板并通过qq邮箱的SMTP服务向用户发送

最近在写注册功能的自动发送邮箱告知验证码的功能,无奈根本没有学过前端,只有写Qt的qss基础,只好借助网页设计自己想要的邮箱格式,最终效果如下: 也推销一下自己的项目ShaderLab,可运行ShaderToy上的大部分着色器代码&…

Weblogic漏洞(二)之 Weblogic漏洞环境安装

Weblogic漏洞环境安装 这里我们使用Kali虚拟机安装docker并搭建vulhub靶场来进行Weblogic漏洞环境的安装 安装 docker #更新软件 apt-get update #安装CA证书 apt-get install -y apt-transport-https ca-certificates #安装docker apt install docker.io #查看docker是否安…

【商业案例应用】C端产品设计流程——团购产品案例

文章目录 1、项目背景介绍2、产品前期分析3、产品规划4、总结 1、项目背景介绍 2、产品前期分析 3、产品规划 4、总结

SSH连接安卓手机Termux —— Android手机

文章目录 前言1.安装ssh2.安装cpolar内网穿透3.远程ssh连接配置4.公网远程连接5.固定远程连接地址 前言 使用安卓机跑东西的时候,屏幕太小,有时候操作不习惯。不过我们可以开启ssh,使用电脑PC端SSH远程连接手机termux。 本次教程主要实现在…

C语言入门 Day_13 二维数组

目录 前言: 1.字符串 2.创建二维数组 3.使用二维数组 4.易错点 5.思维导图 前言: 我们学习了字符类型char,我们可以用char来表示一个大写或者小写的字母,但真实应用中我们往往使用的是多个字符组成的一个单词或者句子。 …

Linux gdb单步调试的原理

文章目录 一、demo演示二、原理分析参考资料 一、demo演示 .section .data message:.string "Hello, World!\n" len . - message.section .text .globl _start _start:# 调用 write() 函数输出 "Hello, World!"mov $1, %rax # 系统调用号为 1…

海域可视化监管:浅析海域动态远程视频智能监管平台的构建方案

一、方案背景 随着科技的不断进步,智慧海域管理平台已经成为海洋领域监管的一种重要工具。相比传统的视频监控方式,智慧海域管理平台通过建设近岸海域视频监控网、海洋环境监测网和海上目标探测网络等,可实现海洋管理的数字化转型。 传统的…

『好书推荐』|《Effective软件测试》

作者简介 《Effective软件测试》 是一本由清华大学出版社出版的图书,作者是[荷]毛里西奥阿尼什(Maurcio Aniche),译者是朱少民、李洁、张元。是2023年6月新推出的一本书籍。 Maurcio Aniche博士是荷兰代尔夫特理工大学软件工程系的…

页面页脚部分CSS分享

先看效果&#xff1a; CSS部分&#xff1a;&#xff08;查看更多&#xff09; <style>body {display: grid;grid-template-rows: 1fr 10rem auto;grid-template-areas: "main" "." "footer";overflow-x: hidden;background: #F5F7FA;min…

使用LightPicture开源搭建私人图床:详细教程及远程访问配置方法

文章目录 1.前言2. Lightpicture网站搭建2.1. Lightpicture下载和安装2.2. Lightpicture网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 现在的手机越来越先进&#xff0c;功能也越来越多&#xff0c;而手机…

urllib库

目录 1、简介 2、请求模块 3、解析模块 1、简介 urllib是python内置的标准库&#xff0c;无需下载&#xff0c;导入即可使用。 2、请求模块 urllib包里有一个request模块 from urllib import request# 1.request模块# 1.1发送网络请求 # urlopen() : 打开url地址 resp re…

进程的概念、组成、特征

1.概念 进程是操作系统进行资源分配的最小的单位。 2.组成 进程由PCB、程序段、数据段组成。PCB是操作系统需要的&#xff0c;而程序段和数据段是用户所需要的。 PCB是一种数据结构&#xff0c;操作系统所需的进程资源都存储在PCB中&#xff0c;PCB也是进程存在的唯一标识。…

【快应用】后台运行的快应用如何自动前台打开

【关键词】 Onhide、router、后台 【问题背景】 快应用退到后台运行后&#xff0c;隔几秒钟后&#xff0c;会自动打开跳转到某个页面&#xff0c;这种情形应该如何去定位处理&#xff1f; 【问题分析】 退到后台运行&#xff0c;再自动拉起看似很诡异&#xff0c;以为是快应…

Autofac使用(3)---AOP支持

1、Nuget引入程序集 2、扩展IInterceptor public class CusotmInterceptor : IInterceptor{/// <summary>/// 切入者逻辑/// /// 使用了Intercept 方法把 要调用的Call方法给包裹起来了/// </summary>/// <param name"invocation"></param>p…

架构设计基础设施保障IaaS弹性伸缩和无服务器计算

目录 1 高可用弹性伸缩实践2 无服务器计算&#xff08;FaaS&#xff09; 1 高可用弹性伸缩实践 背景 弹性伸缩是云服务架构的重要优势&#xff0c;能够很好的解决高并发场景下的性能瓶颈&#xff0c; 同时节省运营成本。 在 IaaS 端&#xff0c;能够弹性伸缩的最实用的产品形…