当前位置: 首页 > news >正文

数据可视化diff工具jsondiffpatch使用学习

1.jsondiffpatch 简介

jsondiffpatch 是一个用于比较和生成 JSON 数据差异的 JavaScript 库。它可以将两个 JSON 对象进行比较,并生成一个描述它们之间差异的 JSON 对象。这个差异对象可以用于多种用途,例如:

  • 生成可视化的差异报告
  • 应用差异到另一个 JSON 对象,从而完成更新
  • 将差异对象转换为文本格式,以便存储或传输

jsondiffpatch 支持多种比较选项,例如忽略某些属性、比较数组时使用不同的算法等。它还提供了许多自定义选项,以便根据您的需求进行配置。jsondiffpatch 可以在浏览器和 Node.js 环境中使用。可以在项目地址找到源码,根据自己的需求进行扩展。

2.jsondiffpatch的使用演示

首先安装 jsondiffpatch 库:可以使用 npm 或 yarn 等包管理工具进行安装,也可以直接在 HTML 页面中引入 jsondiffpatch.js 文件。文件可以在附录中提供的github地址中找到。

接着创建 jsondiffpatch 实例:可以使用 jsondiffpatch.create() 方法创建一个 jsondiffpatch 实例。

比较两个 JSON 对象:使用 jsondiffpatch 实例的 diff() 方法比较两个 JSON 对象,生成一个描述它们之间差异的 JSON 对象。

应用差异到另一个 JSON 对象:使用 jsondiffpatch 实例的 patch() 方法将差异对象应用到另一个 JSON 对象,以更新它。

下面是一个样例:

// 引入 jsondiffpatch 库
const jsondiffpatch = require('jsondiffpatch');// 创建 jsondiffpatch 实例
const diffpatcher = jsondiffpatch.create();// 定义两个 JSON 对象
const obj1 = { name: 'Alice', age: 30 };
const obj2 = { name: 'Bob', age: 35 };// 比较两个 JSON 对象,生成差异对象
const diff = diffpatcher.diff(obj1, obj2);// 应用差异对象到另一个 JSON 对象,更新它
const patchedObj = diffpatcher.patch(obj1, diff);console.log(patchedObj); // 输出 { name: 'Bob', age: 35 }

3.diff结果的可视化

jsondiffpatch 生成的差异对象是一个 JSON 对象,其中包含了被比较的两个 JSON 对象之间的差异信息。如果您想将差异对象可视化展示出来,可以使用jsondiffpatch-formatters这个工具。

jsondiffpatch-formatters是jsondiffpatch的扩展库,提供了多种差异对象的可视化展示格式,包括 HTML、Markdown、Console 等格式。我们可以使用 jsondiffpatch-formatters 的 html.format() 方法将差异对象转换为 HTML 格式的字符串,然后将其插入到页面中展示。

例:

const diff = diffpatcher.diff(obj1, obj2);
const html = jsondiffpatch.formatters.html.format(diff, obj1);
document.getElementById('diff-container').innerHTML = html;

可以参看可视化效果展示来体验效果。
效果展示

4.diff功能的扩展

jsondiffpatch 中可以使用插件增加扩展功能,可以用于增强 jsondiffpatch 的比较和生成差异对象的能力。以下是一些常用的插件及其功能:

  • diff-arrays:这个插件可以使 jsondiffpatch 在比较数组时,按照元素的值而不是索引进行比较。这样可以避免因为数组中元素的顺序不同而导致的不必要的差异。

  • annotated:这个插件可以在生成的差异对象中,为每个差异节点添加注释信息,包括节点的类型、路径、值等。这样可以方便地了解差异对象的结构和含义。

  • delta:这个插件可以将差异对象转换为一种更紧凑的格式,称为“增量格式”(delta format)。增量格式可以减少差异对象的大小,提高传输效率。

  • patch-console:这个插件可以将差异对象打印到控制台中,以便调试和测试。

除了上述插件外,jsondiffpatch 还提供了一些其他的插件,例如 reverse、clone、trivial 等。我们可以根据自己的需求选择适合的插件进行使用。但插件可能会增加 jsondiffpatch 的运行时间和内存消耗,因此在使用插件时需要进行测试。

下面是一个数组比较的演示

// 引入 jsondiffpatch 库和 diff-arrays 插件
const jsondiffpatch = require('jsondiffpatch');
const diffArrays = require('jsondiffpatch/src/diffpatcher-arrays');// 创建 jsondiffpatch 实例,并添加 diff-arrays 插件
const diffpatcher = jsondiffpatch.create({arrays: {detectMove: true,includeValueOnMove: true,},
}).use(diffArrays);// 定义两个数组
const arr1 = [1, 2, 3];
const arr2 = [3, 2, 1];// 比较两个数组,生成差异对象
const diff = diffpatcher.diff(arr1, arr2);console.log(diff); // 输出 { _t: 'a', ... }

在这个例子中,首先引入了 jsondiffpatch 库和 diff-arrays 插件。指定了 diff-arrays 插件的配置选项。使用 use() 方法将 diff-arrays 插件添加到 jsondiffpatch 实例中。

此外还可以对复杂对象的比较进行自定义实现个性化比较,实现不同业务的诉求。下面的例子中演示了这种场景的用法。方法具体含义可以参考github主页学习。

// 自定义比较方法
function myDiff(obj1, obj2, path) {// 如果 obj1 和 obj2 是字符串类型,并且都以 "$" 开头,则比较它们的长度if (typeof obj1 === 'string' && typeof obj2 === 'string' &&obj1.startsWith('$') && obj2.startsWith('$')) {const len1 = parseInt(obj1.substring(1));const len2 = parseInt(obj2.substring(1));if (len1 !== len2) {return [{ op: 'replace', path, value: obj2 }];}}// 否则使用默认的比较方法return jsondiffpatch.diff(obj1, obj2, path);
}// 创建 jsondiffpatch 实例,并设置自定义比较方法
const diffpatcher = jsondiffpatch.create({objectHash: (obj) => obj.id,diff: myDiff,
});// 定义两个对象
const obj1 = { id: 1, name: 'Alice', age: 30 };
const obj2 = { id: 1, name: 'Bob', age: 35 };// 比较两个对象,生成差异对象
const diff = diffpatcher.diff(obj1, obj2);console.log(diff); // 输出 [{ op: 'replace', path: '/name', value: 'Bob' }]

5.总结

基于这个工具,我们可以实现可视化比较。当有定制化比较诉求是,通过扩展函数实现定制化功能,最终可以搭建起我们的diff工具服务。

参考资料

[1]jsondiffpatch源码,https://github.com/benjamine/jsondiffpatch
[2]可视化效果展示,https://benjamine.github.io/jsondiffpatch/demo/index.html
[3]插件,https://github.com/benjamine/jsondiffpatch/blob/master/docs/plugins.md
[4]diff格式说明,https://github.com/benjamine/jsondiffpatch/blob/master/docs/deltas.md

相关文章:

数据可视化diff工具jsondiffpatch使用学习

1.jsondiffpatch 简介 jsondiffpatch 是一个用于比较和生成 JSON 数据差异的 JavaScript 库。它可以将两个 JSON 对象进行比较,并生成一个描述它们之间差异的 JSON 对象。这个差异对象可以用于多种用途,例如: 生成可视化的差异报告应用差异…...

pdf 转 word

pdf 转 word 一、思路 直接调用LibreOffice 命令进行文档转换的命令行工具 使用的前系统中必须已经安装了 libreofficelibreoffice已翻译的用户界面语言包: 中文 (简体)libreoffice离线帮助文档: 中文 (简体)上传字体 重点:重点:重点: 亲…...

【数据结构OJ题】设计循环队列

原题链接:https://leetcode.cn/problems/design-circular-queue/ 1. 题目描述 2. 循环队列的概念和结构 为充分利用向量空间,克服"假溢出"现象的方法是:将向量空间想象为一个首尾相接的圆环,并称这种向量为循环向量。…...

Java 中创建对象有哪些方式?

目录 面试回答 使用 new 关键字 使用反射机制 使用 Class 类的 newInstance() 方法 使用 Constructor 类的 newInstance 方法 使用 clone 方法 使用反序列化 使用方法句柄 使用 Unsafe 分配内存 面试回答 使用 new 关键字 这是我们最常用的、也是最简单的创建对象的方…...

Kafka 消息发送和消费流程

发送消息 流程如下: Producer 端直接将消息发送到 Broker 中的 Leader 分区中Broker 对应的 Leader 分区收到消息会先写入 Page Cache,定时刷盘进行持久化(顺序写入磁盘)Follower 分区拉取 Leader 分区的消息,并保持…...

UVa10048 Audiophobia(floyd)

题意 给出一个图,图中的边表示从点u到点v路径上的噪音。给出q个查询,问从u到v所经路径上的最小噪音 思路 在使用floyd计算点对之间的路径时, D u , v k m i n { D u , v k − 1 , m a x { D u , k k − 1 , D k , v k − 1 } } D_{u, v}^…...

​Redis概述

目录 Redis - 概述 使用场景 如何安装 Window 下安装 Linux 下安装 docker直接进行安装 下载Redis镜像 Redis启动检查常用命令 Redis - 概述 redis是一款高性能的开源NOSQL系列的非关系型数据库,Redis是用C语言开发的一个开源的高键值对(key value)数据库,官方提供测试…...

MsrayPlus多功能搜索引擎采集软件

MsrayPlus多功能搜索引擎采集软件 摘要: 本文介绍了一款多功能搜索引擎软件-MsrayPlus,该软件能够根据关键词从搜索引擎中检索相关数据,并提供搜索引擎任务、爬虫引擎任务和联系信息采集三大功能。我们将分析该软件在不同领域的应用&#xf…...

机器学习之概率论

最近,在了解机器学习相关的数学知识,包括线性代数和概率论的知识,今天,回顾了概率论的知识,贴上几张其他博客的关于概率论的图片,记录学习过程。...

【深度学习 | 数据可视化】 视觉展示分类边界: Perceptron模型可视化iris数据集的决策边界

🤵‍♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨‍💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…...

【计算机视觉】相机基本知识(还在更新)

1.面阵工业相机与线阵工业相机 1.1 基本概念区别 面阵相机则主要采用的连续的、面状扫描光线来实现产品的检测; 线阵相机即利用单束扫描光来进行物体扫描的工作的。 1.2 优缺点 (1)面阵CCD工业相机: 优点:应用面…...

C++ (友元)(类嵌套时,成员函数以及类声明定义的顺序)小demo

#include<iostream> using namespace std; class Building; //1.因为Goodgay类需要声明Building类变量&#xff0c; //所以Building类必须Goodgay类之前声明&#xff08;前向声明&#xff09;&#xff1b; class GoodGay { public:GoodGay();void visit(); private:Build…...

前端实习第五周周记

前言 每一天做了什么还是要记录一下&#xff0c;不然过两天后就会发现&#xff0c;慢慢遗忘自己的收获与做过的东西。 这周做的是医学检验系统的样本库部分。由于是公司的代码所以不能交代具体&#xff0c;那么久聊一下每天具体做了些什么以及我的一些收获。 周一 周一上午…...

【图论】Floyd算法

一.简介 Floyd算法&#xff0c;也称为Floyd-Warshall算法&#xff0c;是一种用于解决所有节点对最短路径问题的动态规划算法。它可以在有向图或带权图中找到任意两个节点之间的最短路径。 Floyd算法的基本思想是通过中间节点逐步优化路径长度。它使用一个二维数组来存储任意两…...

ceph数据分布

ceph的存储是无主结构&#xff0c;数据分布依赖client来计算&#xff0c;有两个条主要路径。 1、数据到PG 2、PG 到OSD 有两个假设&#xff1a; 第一&#xff0c;pg的数量稳定&#xff0c;可以认为保持不变&#xff1b; 第二&#xff0c; OSD的数量可以增减&#xff0c;OSD的…...

mysql的两张表left join 进行关联后,索引进行优化案例

一 mysql的案例 1.1 不加索引情况 1.表1没加索引 2.表2没加索引 3.查看索引 1.2 添加索引 1.表1添加索引 2.表2添加索引 3.查看...

2018年3月全国计算机等级考试真题(语言二级C)

2018年3月全国计算机等级考试真题&#xff08;语言二级C&#xff09; 第1题 设有定义&#xff1a;char s[81]&#xff1b;int i0&#xff1b;以下不能将一行带有空格的字符串正确读入的语句或语句组是 A. while((s[i]getchar())!\n);s[i]\0; B. scanf("%s",s); C.…...

java.util.Timer简介以及简单使用示例

一、简介 定时器&#xff08;Timer&#xff09;是一个工具类&#xff0c;用于安排任务&#xff08;java.util.TimerTask&#xff09;在指定时间后执行或以指定的时间间隔重复执行。它可以用于执行定时任务、定时调度和时间延迟等操作。 定时器&#xff08;Timer&#xff09;可以…...

C语言笔试训练【第12天】

文章目录 1、请阅读以下程序&#xff0c;其运行结果是&#xff08; &#xff09;2、假设编译器规定 int 和 short 类型长度分别为32位和16位&#xff0c;若有下列C语言语句&#xff0c;则 y 的机器数为&#xff08; &#xff09;3、下列程序的输出结果是什么&#xff08; &…...

外网连接局域网的几种方式?快解析内网穿透安全便利吗?

外网连接局域网是一项网络连接中的关键技术&#xff0c;它能够让远程用户通过互联网访问内部局域网中的资源和服务。外网连接局域网为企业提供了更大的灵活性和便捷性&#xff0c;但也需要严格的安全措施来防止未经授权的访问。 外网连接局域网的几种方式 在将外网连接到局域…...

你还在给每个图片父元素加类名?CSS :has() 让选择器“逆天改命”

你还在给每个图片父元素加类名&#xff1f;CSS :has() 让选择器“逆天改命” 引言 “组长&#xff0c;这个需求我写不了。” “什么需求&#xff1f;” “产品经理说&#xff0c;所有包含图片的卡片&#xff0c;要在卡片上加一个‘带图标识’的边框。但是这些卡片是动态渲染的&…...

效率提升秘籍:用快马AI自动生成六花直装更新页面,节省开发时间

作为一名经常需要维护应用更新页面的开发者&#xff0c;我深刻体会到手动编写更新日志的繁琐。每次版本迭代&#xff0c;从整理更新内容到排版发布&#xff0c;往往要耗费大量时间。最近尝试用InsCode(快马)平台的AI功能自动生成更新页面&#xff0c;效率提升非常明显。 传统更…...

Qt串口通信实战:用QSerialPort从零搭建一个串口调试助手(附完整源码)

Qt串口通信实战&#xff1a;从零构建工业级调试助手 在嵌入式开发和工业控制领域&#xff0c;串口通信作为最基础也最可靠的通信方式之一&#xff0c;至今仍发挥着不可替代的作用。无论是单片机与上位机的数据交换&#xff0c;还是工业设备的参数配置&#xff0c;一个稳定高效的…...

数字减影血管造影系统市场洞察:至2032年将攀升至557.6亿元

据恒州诚思最新调研数据显示&#xff0c;2025年全球数字减影血管造影系统&#xff08;DSA&#xff09;市场规模预计达386.7亿元&#xff0c;至2032年将攀升至557.6亿元&#xff0c;2026-2032年复合增长率&#xff08;CAGR&#xff09;为5.5%。这一增长受全球老龄化加速、心血管…...

Win10下mitie安装失败:subprocess.CalledProcessError的深度排查与实战修复

1. 问题现象与初步分析 最近在Windows10系统上折腾MITIE这个自然语言处理工具包时&#xff0c;遇到了一个让人头疼的错误。当时按照常规流程&#xff0c;先下载了mitie的源码压缩包&#xff0c;解压后执行python setup.py install&#xff0c;结果命令行突然弹出一堆红色报错&a…...

算法基础篇(11)Floyd算法

Floyd算法本质是动态规划&#xff0c;用来求任意两点之间的最短路&#xff0c;也称为插点法。通过不断在两点之间加入新的点来更新最短路。1、状态表示&#xff1a;f[k][i][j]表示&#xff1a;仅仅经过1~k这些点&#xff0c;结点i走到结点j的最短路径的长度。2、状态转移方程&a…...

如何用3步实现Jable视频高效下载?开源工具jable-download的完整解决方案

如何用3步实现Jable视频高效下载&#xff1f;开源工具jable-download的完整解决方案 【免费下载链接】jable-download 方便下载jable的小工具 项目地址: https://gitcode.com/gh_mirrors/ja/jable-download jable-download是一款专为普通用户设计的Jable视频下载工具&am…...

CREST:如何用5分钟开启分子构象探索之旅?

CREST&#xff1a;如何用5分钟开启分子构象探索之旅&#xff1f; 【免费下载链接】crest Conformer-Rotamer Ensemble Sampling Tool based on the xtb Semiempirical Extended Tight-Binding Program Package 项目地址: https://gitcode.com/gh_mirrors/crest/crest 在…...

2026最权威一键生成论文工具榜单:这些被高校和导师悄悄推荐的软件你用了吗

一键生成论文工具正成为学术研究的重要助力&#xff0c;其高效性与专业性在近年来得到广泛认可。依托权威检测平台数据、高校实测反馈及用户真实评价&#xff0c;这些工具已逐步成为科研工作者和学生群体的得力助手。本文将盘点2026年最受高校和导师推荐的一键生成论文软件&…...

3步在Mac上免费运行Stable Diffusion的终极指南

3步在Mac上免费运行Stable Diffusion的终极指南 【免费下载链接】MochiDiffusion Run Stable Diffusion on Mac natively 项目地址: https://gitcode.com/gh_mirrors/mo/MochiDiffusion 还在为寻找合适的Mac AI绘画工具而烦恼吗&#xff1f;想要完全离线生成惊艳的AI艺术…...