json diff patch

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

目录

流程

安装

效果

使用

自适应

数组:最长公共子序列(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
  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值