json diff patch

news2024/11/27 14:44:50

文件和图片的比对靠字符串

目录

流程

安装

效果

使用

自适应

数组:最长公共子序列(LCS)

数组中的对象,给定id,类似dom tree的比较


流程

安装

npm install jsondiffpatch

import * as jsondiffpatch from 'jsondiffpatch';
const jsondiffpatchInstance = jsondiffpatch.create(options);

效果

// 示例数据
const country = {
  name: 'Argentina',
  capital: 'Buenos Aires',
  independence: new Date(1816, 6, 9),
  unasur: true,
};

// 克隆 country,使用 dateReviver 处理 Date 对象
const country2 = JSON.parse(JSON.stringify(country), jsondiffpatch.dateReviver);

// 进行一些更改
country2.name = 'Republica Argentina';
country2.population = 41324992;
delete country2.capital;

// 计算原始对象和修改后对象之间的差异(delta)
const delta = jsondiffpatch.diff(country, country2);

// 断言差异是否符合预期的更改
assertSame(delta, {
  name: ['Argentina', 'Republica Argentina'], // 旧值,新值
  population: ['41324992'], // 新值
  capital: ['Buenos Aires', 0, 0], // 删除
});

// 对原始对象应用差异
jsondiffpatch.patch(country, delta);

// 反转差异
const reverseDelta = jsondiffpatch.reverse(delta);
// 也可以使用 jsondiffpatch.unpatch(country2, delta) 将 country2 返回到原始值

// 再次计算应用差异后的对象和修改后对象之间的差异
const delta2 = jsondiffpatch.diff(country, country2);
assert(delta2 === undefined);
// undefined => 没有差异

使用

import * as jsondiffpatch from 'jsondiffpatch';

// 仅在需要使用 diff-match-patch 进行文本差异对比时导入
import DiffMatchPatch from 'diff-match-patch';

const jsondiffpatchInstance = jsondiffpatch.create({
  // 用于在比较数组时匹配对象,默认仅使用 === 操作符
  objectHash: function (obj) {
    // 该函数仅在对象不是按引用相等时使用
    return obj._id || obj.id;
  },
  arrays: {
    // 默认为 true,检测数组中移动的项(否则将注册为删除+添加)
    detectMove: true,
    // 默认为 false,移动的项的值不包含在差异中
    includeValueOnMove: false,
  },
  textDiff: {
    // 如果使用文本差异,则需要通过这个属性传入 diff-match-patch 库
    // 或者,可以通过使用 `jsondiffpatch/with-text-diffs` 导入 jsondiffpatch 来避免传递 diff-match-patch
    diffMatchPatch: DiffMatchPatch,
    // 默认为 60,使用文本差异算法(google-diff-match-patch)的最小字符串长度(左右两侧)
    minLength: 60,
  },
  propertyFilter: function (name, context) {
    /*
       这是一个可选的函数,用于忽略对象属性(例如,易变的数据)
        name: 属性名称,存在于 context.left 或 context.right 对象中
        context: 差异上下文(具有 context.left 和 context.right 对象)
      */
    return name.slice(0, 1) !== '$';
  },
  cloneDiffValues: false /* 默认为 false。如果为 true,则在获得的差异中值将被克隆
      (默认使用 jsondiffpatch.clone),以确保差异不保留对左或右对象的引用。
      如果多次对相同的对象进行差异比较和合并而不序列化差异,则这将变得有用。
      可以在这里指定一个自定义的 clone(value) 函数,而不是 true
      */,
});

https://github.com/benjamine/jsondiffpatch

自适应

数组:最长公共子序列(LCS)

数组中的对象,给定id,类似dom tree的比较

  • 要匹配数组中的对象,您必须提供一个函数(这是匹配对象的方式,否则将使用按位置进行哑匹配)。有关更多详细信息,请查看 Array diff 文档objectHash

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

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

相关文章

ASP.NET医院手麻信息系统源码 .NET6.0+VUE

目录 麻醉记录单 复苏记录单 麻醉文书 手术麻醉信息 1、 体征监控记录 2、 麻醉用药信息 3、 手术事件登记 4、 手术状态变更 5、 麻醉医师交接 6、 其他辅助操作 手麻信息系统是以服务围术期临床业务工作的开展为核心,通过与床边监护设备以及医院H…

Github 2024-04-18 Go开源项目日报Top10

根据Github Trendings的统计,今日(2024-04-18统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10Vue项目1TypeScript项目1Ollama: 本地大型语言模型设置与运行 创建周期:248 天开发语言:Go协议类型:MIT LicenseStar数量:42421 个…

C语言结构体与公用体

结构体 概述 有时我们需要将不同类型的数据组合成一个有机的整体,如:一个学生有学号/姓名/性别/年龄/地址等属性这时候可通过结构体实现结构体(struct)可以理解为用户自定义的特殊的复合的“数据类型” 可以理解为其他语言的object类型 结构体变量的定…

CSS 01

CSS层叠样式表 HTML的局限性 HTML只关注内容的语义,可以做简单的样式,却带来了无限的臃肿和繁琐。 CSS CSS是层叠样式表的简称,也被称之为CSS样式表或级联样式表。CSS也是一种标记语言。   CSS主要用于设置HTML页面中的文本内容(字体、大…

【第1节】书生·浦语大模型全链路开源开放体系

目录 1 简介2 内容(1)书生浦语大模型发展历程(2)体系(3)亮点(4)全链路体系构建a.数据b 预训练c 微调d 评测e.模型部署f.agent 智能体 3 相关论文解读4 ref 1 简介 书生浦语 InternLM…

SAP打印输出设置

SAP打印输入有很多方式,适合不同的应用场景。 一.打印输出总体概览图 二.前台打印 这个是比较常见的,前端打印的出现减轻了管理员的工作量,用户可以选择自己电脑上的打印机输出,不需要所有打印机都在SAP平台中进行配置&#xff0…

学习STM32第十五天

SPI外设 一、简介 STM32F4XX内部集成硬件SPI收发电路,可以由硬件自动执行时钟生成、数据收发等功能,减轻CPU负担,可配置8位/16位数据帧,高位(最常用)/低位先行,三组SPI接口,支持DMA…

Linux 存储:NAND 写入异常案例 (1)

文章目录 1. 前言2. 案例背景3. 案例问题4. 案例分析4.1 普通文件写入流程概要4.2 dd 写 NAND 时,会不会使用 page cache ?4.3 dd 写 NAND 时,对比 U-Boot 读 NAND,是否采用了相同的坏块策略 ?4.3.1 U-Boot 读 NAND 过…

【经验总结】Jupyter 配置内核

1. 背景描述 使用 国家超算互联网中心 的服务器,创建 jupyterlab 容器,想在之前 conda 创建的环境中运行,可是不行,进入容器就直接进入 jupyterlab 2. 解决方法 配置内核 2.1 激活环境 conda activate peft2.2 安装内核 pip…

【Python基础】字典

文章目录 [toc]什么是字典键值对示例键异常 遍历列表什么是遍历遍历字典的键keys()方法 遍历字典的值values()方法 遍历字典的键值对items()方法 字典操作增加键值对修改键值对查询键值对get()方法 删除键值对delclear()方法 个人主页:丷从心 系列专栏:…

牛客Linux高并发服务器开发学习第二天

Gcc编译 利用gcc 生成应用时如果不加-o 和应用名,默认生成a.out 可以用./ a.out打开 Gcc工作流程 可执行程序Windows系统中为.exe Linux系统中为.out g也可以编辑c程序 gcc也可以编译cpp代码,只是在编译阶段gcc不能自动共和C程序使用的库进行联接&…

kettle从入门到精通 第五十三课 ETL之kettle MQTT/RabbitMQ producer 实战

1、MQTT介绍 MQTT (Message Queuing Telemetry Transport) 是一种轻量级的消息传输协议,设计用于连接低带宽、高延迟或不可靠网络的设备。 MQTT 是基于发布/订阅模式(Publish/Subscribe)的协议,其中设备可以发布消息到一个主题&…

【Linux系列】Ctrl + R 的使用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Eland上传bge-large-zh-v1.5向量化模型到ElasticSearch中

最近需要做一些向量检索,试试ES 一、准备 系统:MacOS 14.3.1 ElasticSearch:8.13.2 Kibana:8.13.2 本地单机环境,无集群,也不基于Docker BGE是一个常见的文本转向量的模型,在很多大模型RAG应…

SpringBootSpringCloud升级可能会出现的问题

1.背景 之前负责过我们中台的SpringBoot和Cloud的升级,特次记录分享一下项目中可能出现的问题,方便后续的人快速定位问题。以及下述选择的解决方案都是基于让升级的服务影响和改动最小以及提供通用的解决方案的提前进行选择的。 1.1版本说明 升级前&a…

js进阶 事件循环(持续更新)

导入 js是单线程,同一时间只能做一件事,事件循环(EventLoop)来打破这个局面 异步任务 ajax网络请求setTimeout定时函数 简易粗糙的事件循环 同步任务进入主线程主执行栈异步任务进入任务队列主任务栈任务执行完毕,从任务队列读取对应任务…

npm怎么迁移到pnpm

下载的vue3模板用到了pnpm,就安装了一下 但是安装之后使用pnpm install 就发现包全被移动到ignored文件夹下面了,还报错 PS G:\Projects\gitProeject\TS_front> pnpm installWARN  Moving commitlint/config-conventional that was installed by a different …

中兴F7607P自启动程序,关闭JAVA插件

本文目的:关闭光猫内自动运行的JAVA插件,并实现开机自动调用用户的程序启动 移动定制版F7607P不带LXC容器,取而代之的是JAVA虚拟机,内置多个插件,包括名为CMCCDPI的插件,用途可以从名字上窥见。机器rootfs分…

快速上手Linux核心命令

Linux 的重要性不用我多说了吧,大多数互联网公司,服务器都是采用的Linux操作系统 Linux是一个主要通过命令行来进行管理的操作系统。 只有熟练掌握Linux核心命令,在使用起来我们才会得心应手 这里给大家整理了Linux一些核心命令&#xff0…

一些docker安装配置以及常见命令

​常用命令 docker 命令 //进去容器内部,找到需要拷贝的文件及目录 docker exec -it 2c2600fb60f8 /bin/bash ​ //将container id为4db8edd86202的容器内elasticsearch.yml文件拷贝到宿主机指定目录下: docker cp 4db8edd86202:/usr/share/elasticsea…