js:使用diff.js实现文本内容差异比较

news2024/11/25 23:00:41

实现效果
在这里插入图片描述

目录

    • 简介
    • 安装
    • 示例
      • 1、json比较diffJson
      • 2、按行比较diffLines
      • 3、比较数组diffArrays
    • 总结
    • 参考资料

简介

A javascript text differencing implementation.

译文:javascript文本差异实现。

相关文档

  • github https://github.com/kpdecker/jsdiff
  • npmjs https://www.npmjs.com/package/diff

安装

npm

npm install diff --save

CDN:

https://unpkg.com/diff@5.1.0/dist/diff.js

示例

1、json比较diffJson

// CommonJS
// const Diff = require('diff')

// EMS
import * as Diff from 'diff'

const one = {
  id: 1,
  name: 'Tom',
  age: 18,
}

const other = {
  id: 2,
  name: 'Jack',
  age: 18,
}

const diff = Diff.diffJson(one, other)

console.log(diff);


输出

[
  { count: 2, value: '{\n  "age": 18,\n' },
  {
    count: 2,
    added: undefined,
    removed: true,
    value: '  "id": 1,\n  "name": "Tom"\n'
  },
  {
    count: 2,
    added: true,
    removed: undefined,
    value: '  "id": 2,\n  "name": "Jack"\n'
  },
  { count: 1, value: '}' }
]

2、按行比较diffLines

// const Diff = require('diff')
import * as Diff from 'diff'

const one = {
  id: 1,
  name: 'Tom',
  age: 18,
}

const other = {
  id: 2,
  name: 'Jack',
  age: 18,
}

const diff = Diff.diffLines(
  JSON.stringify(one, null, 2),
  JSON.stringify(other, null, 2)
)

console.log(diff)

输出

[
  { count: 1, value: '{\n' },
  {
    count: 2,
    added: undefined,
    removed: true,
    value: '  "id": 1,\n  "name": "Tom",\n'
  },
  {
    count: 2,
    added: true,
    removed: undefined,
    value: '  "id": 2,\n  "name": "Jack",\n'
  },
  { count: 2, value: '  "age": 18\n}' }
]

3、比较数组diffArrays

// const Diff = require('diff')
import * as Diff from 'diff'

const one = {
  id: 1,
  name: 'Tom',
  age: 18,
}

const other = {
  id: 2,
  name: 'Jack',
  age: 18,
}

const diff = Diff.diffArrays(
  JSON.stringify(one, null, 2).split('\n'),
  JSON.stringify(other, null, 2).split('\n'),
)

console.log(diff);


// 组装结果
let list = diff.map((part) => {
  if (part.added) {
    return part.value.map(x=>'+' + x).join('\n')
  } else if (part.removed) {
    return part.value.map(x=>'-' + x).join('\n')
  } else {
    return part.value.join('\n')
  }
})

console.log(list.join('\n'))

输出

[
  { count: 1, value: [ '{' ] },
  {
    count: 2,
    added: undefined,
    removed: true,
    value: [ '  "id": 1,', '  "name": "Tom",' ]
  },
  {
    count: 2,
    added: true,
    removed: undefined,
    value: [ '  "id": 2,', '  "name": "Jack",' ]
  },
  { count: 2, value: [ '  "age": 18', '}' ] }
]

组合后输出

{
-  "id": 1,
-  "name": "Tom",
+  "id": 2,
+  "name": "Jack",
  "age": 18
}

总结

通过以上示例可以发现:

  1. json比较的缺点,行的先后顺序 改变了
  2. 按行比较的缺点,有很多的 回车符 \n 不好按行处理
  3. 比较数组较为理想,可以继保留了输入顺序,同时也能够按行处理比较结果

参考资料

  1. 在线示例
  2. diff.js使用指南

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

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

相关文章

YoloV8改进---注意力机制:高斯上下文变换器GCT,性能优于ECA、SE等注意力模块 | CVPR2021

目录 1.GCT介绍 实验结果 2.GCT引入到yolov8 2.1 修改modules.py中: 2.2 加入tasks.py中: 2.3 yolov8_GCT.yaml 3.YOLOv8魔术师专栏介绍 1.GCT介绍 论文:https://openaccess.thecvf.com/content/CVPR2021/papers/Ruan_Gaussian_Context_…

MySQL数据库架构

MySQL数据库架构 MySQL架构自顶向下大致可以分为连接层 , SQL层 , 存储引擎层 , 物理文件层。架构如下 连接层 -- 查看最大连接数 show variables like %max_connections%;客户端连接器,MySQL向外提供交互接口连接各种不同的客户端。 客户端/应用程序:客…

7.3.6 【Linux】磁盘/文件系统参数修订

mknod 用到的磁盘 /dev/vda 的相关设备代码如下: 上表当中 252 为主要设备代码 (Major) 而 0~5 则为次要设备代码 (Minor)。 我们的Linux 核心认识的设备数据就是通过这两个数值来决定的!举例来说&#xf…

如何批量将PDF转换为图片?

在生活工作中,我们会处理很多电子合同。这些电子合同一般是PDF格式,不但存储空间大,且预览起来不太便捷,需要我们转换为图片格式更方便预览。如果人工一一处理比较繁琐复杂,有没有什么方案可以快速将pdf转换为图片呢&a…

如果想用unity做一个项目作为面试作品,至少该达到什么样的标准?

本文仅针对题目“如果想用unity做一个项目作为面试作品,至少该达到什么样的标准?”回答内容。 明确职业目标 首先要明确自身的职业目标,不同的行业、公司、游戏类型、岗位对作品的要求是不同的。 去什么样的行业?unity可做的有很…

python的IOError使用

try:npzfile np.load(calibrate.npz)mtx npzfile[mtx]dist npzfile[dist]except IOError:calibrate()python语言IOError错误一般多发生在对文件操作报错时,表示要打开的文件不存在

PostpreSQL内核学习-Chapter4 Foreign Data Wrapper(FDW)

FDW连接 preparations 两个在不同主机(满足TCP/IP连接是分属于不同IP地址下)(如果是安装PG源码)进入源码目录下面的/contrib/postgres_fdw/,然后用make & make install编译和安装 [rootlocalhost /]# cd 源码存…

为什么truncate函数(四舍五入)是x+0.4999997而不是+0.5?

目录 float的不精确表示 0.5的舍入方法 该方法的漏洞 0.4999997f舍入的结果错误 以0.4999997f改进舍入方法 可以用0.49999996、0.49999998或者0.49999999替换0.49999997吗? 在做舍入函数研究时,发现函数中实现四舍五入的trunc函数大概采用的逻辑是floor(…

LVS负载均衡-----DR模式

目录 1.DR模式原理 2.DR 模式的特点: 3.LVS-DR中的ARP问题 问题原因: 解决方法: 问题二:返回报文时源地址使用VIP,导致网关设备的ARP缓存表紊乱 解决方法: 4.DR模式 LVS负载均衡群集部署 1.配置负…

python进程线程问题

参考链接: 代码可去原博文复制: python缩短大量数据处理时间-进程池pool()和map() 一 定义与解释 1、对于python代码,多线程其实是个假的,因为每次计算的时候,实质上只有一个线程计算。使用多线程时,是几…

【天池题解】题解:CAAI-BDSC2023社交图谱链接预测(任务一:社交图谱小样本场景链接预测)

【天池题解】题解:CAAI-BDSC2023社交图谱链接预测(任务一:社交图谱小样本场景链接预测) 文章目录 【天池题解】题解:CAAI-BDSC2023社交图谱链接预测(任务一:社交图谱小样本场景链接预测&#xf…

中介者模式的学习与使用

1、中介者模式的学习 中介者模式是一种行为型设计模式,它通过引入一个中介者对象来解耦一组对象之间的交互。中介者模式促进了对象之间的松耦合,使得它们可以独立地进行通信,而不需要直接相互引用。   在中介者模式中,有以下几个…

获取文件大小并转换单位

天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…

【工具使用】Notepad++如何使用正则表达式同时搜索多个字符串

一,简介 在调试代码定位问题的时候,由于log打印比较多,故需要使用NotePad文本编辑器进行搜索,并且需要同时搜索多个字符串,本文介绍如何同时搜索多个字符串,供参考。 二,操作步骤 2.1 搜索设…

90、基于STM32单片机数字频率计频率检测配NE555脉冲发生器设计(程序+原理图+PCB源文件+参考论文+硬件设计资料+元器件清单等)

单片机主芯片选择方案 方案一:AT89C51是美国ATMEL公司生产的低电压,高性能CMOS型8位单片机,器件采用ATMEL公司的高密度、非易失性存储技术生产,兼容标准MCS-51指令系统,片内置通用8位中央处理器(CPU)和Flash存储单元&a…

如何基于 ESP-IDF SDK 为应用工程添加自定义的 menuconfig 编译条件设置?

在工程的 main 目录下添加 Kconfig.projbuild 文件对需要添加自定义设置的参数进行定义在应用代码中使用自定义设置的参数编写 Kconfig.projbuild 文件 在工程的 main 目录下添加 Kconfig.projbuild 文件 接下来会基于 esp-idf/examples/peripherals/uart/uart_async_rxtxtask…

Python黑魔法揭秘:超强公共操作符和推导式的编程技巧

文章目录 前言公共操作1.运算符1) 合并操作2)* 复制操作in / not in 判断数据在 / 不在容器中 公共方法len()del / del()max()min()range()enumerate() 容器类型转换1)list() 将某个序列转化为列表tuple() 将某个序列转换为元组set() 将某个序…

OpenCloudOS社区开源,助力软件开发

早前红帽宣布限制源代码访问性的政策,并解释说RHEL相关源码仅通过CentOS Stream公开,付费客户和合作伙伴可通过Red Hat Customer Portal访问到源代码,由此也导致非客户获取源码越来越麻烦, 据了解,CentOS是红帽发行的…

效率为王!项目管理软件如何帮你提高效率?

对于任何商业组织及其客户来说,低效率的员工和浪费的时间都是一个问题。团队成员懈怠会对团队的整体效率产生负面影响。除了巨大的财务挫折之外,这些问题的混合还导致多次延误、工作质量差和客户不满意。 但有了正确的项目管理软件,企业就可…

Netty各组件执行流程及原理

目录 一、netty执行流程 二、EventLoop 1、事件循环对象EventLoop 2、事件循环对象组EventLoopGroup 3、io任务 4、分工细化 5、handler执行中如何换的group 三、Channel 1、常用方法 2、channelFuture 3、为什么要异步 四、Future & Promise 1、jdk future …