对比两个json对象有那几个字段被修改,并返回有改动的字段内容

 如果您想比较两个 JSON 对象,找出哪些字段发生了变化,并返回发生变化的字段及其新的值,您可以编写一个函数来递归比较对象。以下是一个 TypeScript 示例:

type JSONValue = string | number | boolean | null | JsonObject | JsonArray;
interface JsonObject {[key: string]: JSONValue;
}
type JsonArray = JSONValue[];function compareObjects(obj1: JsonObject, obj2: JsonObject): JsonObject {const changedFields: JsonObject = {};for (const key in obj1) {if (obj1.hasOwnProperty(key)) {const value1 = obj1[key];const value2 = obj2[key];if (isObject(value1) && isObject(value2)) {// 递归比较嵌套的对象const nestedChanges = compareObjects(value1, value2);if (Object.keys(nestedChanges).length > 0) {changedFields[key] = nestedChanges;}} else if (!isEqual(value1, value2)) {// 如果值不相等,记录变化changedFields[key] = value2;}}}// 检查 obj2 中新增的字段for (const key in obj2) {if (obj2.hasOwnProperty(key) && !obj1.hasOwnProperty(key)) {changedFields[key] = obj2[key];}}return changedFields;
}// 判断是否为对象
function isObject(value: any): value is JsonObject {return typeof value === 'object' && value !== null && !Array.isArray(value);
}// 判断两个值是否相等
function isEqual(value1: JSONValue, value2: JSONValue): boolean {if (isObject(value1) && isObject(value2)) {return compareObjects(value1, value2).length === 0;}return value1 === value2;
}// 示例
const json1: JsonObject = { a: 1, b: { c: 2, d: 3 } };
const json2: JsonObject = { a: 1, b: { c: 5, d: 3 }, e: 'newField' };const changes = compareObjects(json1, json2);
console.log(changes);

这个函数 compareObjects 将递归比较两个对象,并返回发生变化的字段及其新值。在示例中,changes 对象将包含 { b: { c: 5 }, e: 'newField' },表示字段 b 中的 c 值发生了变化,以及新添加了字段 e。您可以根据实际需求调整这个函数。

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

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

相关文章

LNMP平台对接redis服务

目录 1、安装 LNMP 各个组件 2、安装 redis 服务 3、安装 redis 扩展 4、修改 php 配置文件 5、测试连接 1、安装 LNMP 各个组件 2、安装 redis 服务 3、安装 redis 扩展 官网:http://redis.io/ 下载包: https://codeload.github.com/phpredis/p…

C++:常量

const的最初动机 const的使用方法 使用const的好处是允许指定一种语义上的约束,即某种对象不能被修改,且由编译器具体实施这种约束。 const声明格式:const 类型名 对象名;修饰普通变量,时期不能被随意修改 【注意】1.C中的const…

探索大模型时代下的文档识别与分析【GPT4-V带来的挑战与机遇】

中国图象图形学学会青年科学家会议是由中国图象图形学学会青年工作委员会发起的学术会议。本会议面向国际学术前沿与国家战略需求,致力于支持图象图形领域的优秀青年学者,为青年学者们提供学术交流与研讨的平台,促进学者之间的交流与合作。会…

深入理解C#中的引用类型、引用赋值以及 `ref` 关键字

深入理解C#中的引用类型、引用赋值以及 ref 关键字 在C#编程中,理解引用类型、引用赋值以及 ref 关键字的使用对于编写高效、可靠的代码至关重要。本文将深入探讨这些概念,帮助您更好地理解C#的工作原理。 引用类型简介 在C#中,所有的类型都…

MySQL的事务机制

一、事务机制简述 事务机制,避免写入直接操作数据文件;利用日志来实现间接写入,与事务有关的, redo日志与undo日志;sql语句操作记录复制到undo日志然后增删改查操作的结果会记录在redo日志,如果操作没有什么问题就把数据同步到数…

【MySQL】MySQL版本8+ 的 with recursive 递归语法初次使用

力扣题 1、题目地址 1613. 找到遗失的ID 2、模拟表 表:Customers Column NameTypecustomer_idintcustomer_namevarchar customer_id 是该表主键.该表第一行包含了顾客的名字和 id. 3、要求 编写一个解决方案, 找到所有遗失的顾客 id。遗失的顾客 id 是指那些…

代码随想录算法训练营第三十天 | 332.重新安排行程、51. N皇后、37. 解数独

332.重新安排行程 题目链接:332.重新安排行程 给你一份航线列表 tickets ,其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK(肯尼迪国际机场)出发的…

安卓fragment监听文本内容取值

首先需要自己定义一个最大的BaseFragment&#xff0c;继承这个BaseFragment并在骑宠填充你需要绑定的Fragment class LoginFragment : BaseFragment<FragmentLoginBinding>(R.layout.fragment_login) { }顶自己需要获取的值 private lateinit var account: EditTextpriv…

Prometheus C++使用教程

1 简介 Prometheus是一个包括时序数据库的工具&#xff0c;可以将指标Metric数据传入Prometheus&#xff0c;然后通过Grafana可视化出来。 Grafana是一个通用的数据看板&#xff0c;可以通过自定义的看板&#xff0c;实时的观察各类指标的变化。 2 安装Prometheus 2.1 安装d…

综合指南:理解气体检测仪的关键功能和单位换算

随着科技的飞速发展&#xff0c;气体检测仪在各行各业中的应用已十分普遍&#xff0c;其主要用途是检测环境中的气体浓度。 1、检测气体纯度 主要用于气体储罐、管道等储运设备中检测气体的纯度&#xff0c;一般都是专门针对高纯气体的浓度值进行检测&#xff0c;常见的如氩气…

C语言数组基础知识

目录 一维数组&#xff1a; 一维数组的创建&#xff1a; 一维数组的访问&#xff1a; 一维数组在内存中的存储&#xff1a; 二维数组&#xff1a; 二维数组的创建&#xff1a; 二维数组的初始化&#xff1a; 二维数组的使用&#xff1a; 二维数组在内存中的存储&#x…

部署Gitea服务的那些坑

目标&#xff1a;在win10系统上部署Gitea服务&#xff0c;以ssh协议的方式访问。 首先要在win10系统上安装ssh服务&#xff0c;这里安装OpenSSH即可&#xff0c;PowerShell脚本如下&#xff08;记住管理员运行&#xff09;&#xff1a; # 打开 PowerShell 以管理员身份运行 #…

为什么会有js?

JavaScript&#xff08;简称为JS&#xff09;是一种脚本语言&#xff0c;主要用于为网页添加交互性和动态效果。JS的出现主要有以下几个原因&#xff1a; 网页交互性的需求&#xff1a;早期的静态网页只能展示信息&#xff0c;无法与用户进行交互。随着互联网的发展&#xff0c…

上海晋名室外暂存柜助力石墨烯材料行业气瓶储存安全

近日上海晋名又有一台室外气瓶暂存柜项目通过验收&#xff0c;此次项目主要用于石墨烯材料行业气瓶的室外暂存。 用户单位创立于2017年&#xff0c;是一家从事石墨烯等新材料技术的科技型高新技术企业。 上海晋名作为一家专注工业安全防护领域&#xff0c;危险化学品安全储存…

JavaScript-内置对象-笔记

1.Math对象 Math对象&#xff1a; 用于进行数字处理 自带的对象 不是构造函数---不需要new 属性&#xff1a; Math.PI ----- 圆周率 方法&#xff1a; Math.floor(数字) ----- 向下取整 &#xff08;只要整数位&#xff09; Math.ceil(数字) ---- 向上取整&#xff08;不管小数…

web安全之XSS攻击原理及防范

XSS攻击原理 XSS&#xff08;Cross-Site Scripting&#xff0c;跨站脚本攻击&#xff09;是一种常见的网络攻击方式。攻击者通过在受害者的浏览器中注入恶意脚本&#xff0c;来实现对受害者的会话劫持、敏感信息窃取等非法目的。但是在实际的项目开发中&#xff0c;除了少数企…

RocketMQ Dashboard可视化工具

RocketMQ Dashboard 将 RocketMQ的相关指标展示在web页面 &#xff0c;支持以可视化工具代替 Topic 配置、Broker 管理等命令行操作。 官方文档地址&#xff1a;RocketMQ Dashboard | RocketMQ 目录 1.下载安装 1.1 系统要求&#xff1a; 1.2 源码安装 1.3 访问页面 2.功…

如何搭建开源知识库软件AFFiNE并实现公网环境远程协作【内网穿透】

目录 前言 1. 使用Docker安装AFFINE 2. 安装cpolar内网穿透工具 3. 配置AFFINE公网访问地址 4. 实现公网远程访问AFFINE 结语 作者简介&#xff1a; 懒大王敲代码&#xff0c;计算机专业应届生 今天给大家聊聊如何搭建开源知识库软件AFFiNE并实现公网环境远程协作【内网穿…

借势API电商数据采集汇总分析

电商数据采集的网页抓取数据、淘宝、天猫、京东等平台的电商数据抓取&#xff0c;网页爬虫、采集网站数据、网页数据采集软件、python爬虫、HTM网页提取、APP数据抓包、APP数据采集、一站式网站采集技术、BI数据的数据分析、数据标注等成为大数据发展中的热门技术关键词。那么电…

使用python读取yaml文件数据

使用python读取yaml文件&#xff1a; yaml文件数据&#xff1a;data.yaml login_data:url: http://www.baidu.comcase1:user1: password1: 12345errorText: 请输入用户名case2:user2: adminpassword2: errorText: 请输入密码case3:user3: adminpassword3: 123456errorText: 登…