Skip to content

deepDiff

deepDiff方法用于查询两个 JSON 对象的差异值,返回一个差异对象,键为路径(使用 #/key/ 格式,与 RW 的引用语法一致),值为 { left, right } 结构,分别记录 json1json2 中的值。

语法

javascript
deepDiff(json1, json2)

描述

deepDiff方法递归地比较两个 JSON 对象,找出所有不同的值。返回的差异对象中,每个键表示一个差异路径,对应的值为 { left, right } 对象,leftjson1 中的值,rightjson2 中的值。

路径格式遵循以下规则:

  • 根层级的键直接使用键名,如 name
  • 嵌套层级的键使用 #/key/ 引用语法,如 #/info/version
  • 当某一侧不存在该键时,对应的 leftrightundefined

该函数仅对同类型的对象或数组进行递归比较;对于类型不一致或非对象/数组的属性,直接通过严格不等(!==)判断差异。依赖 ramda 的 type 进行类型判断。

参数

json1 object

  比较的第一个 JSON 对象,差异结果中其值记录在 left 字段。

json2 object

  比较的第二个 JSON 对象,差异结果中其值记录在 right 字段。

返回值

object

  返回一个差异对象。键为差异路径(根层级为键名,嵌套层级使用 #/key/ 格式),值为 { left, right } 对象。

注意事项

  • 路径格式使用 #/key/ 语法,与 RW 的引用语法一致,可直接用于 RW 代理的读写操作
  • 根层级的键名不带 #/ 前缀,直接使用键名作为差异对象的键
  • 嵌套层级的键名使用 #/parent/key 格式,逐层用 / 分隔
  • 仅对同类型的对象(Object)或数组(Array)进行递归比较,类型不一致时直接判定为差异
  • 对于基本类型值,使用严格不等(!==)进行比较
  • 仅在 json1 中存在的键,差异结果中 rightundefined;仅在 json2 中存在的键,leftundefined
  • 依赖 ramda 的 type 进行类型判断

示例

基础用法

嵌套对象差异

数组差异

浏览器兼容

deepDiff 函数在所有现代浏览器中均可使用,不依赖任何浏览器特定 API。

性能考虑

  • 时间复杂度: O(n) - 需要遍历两个对象的所有键,其中 n 为对象属性总数
  • 空间复杂度: O(d + m) - 递归调用栈深度为对象嵌套深度 d,差异对象存储 m 个差异项
  • 使用 ramda 的 type 进行类型判断,开销较小
  • 仅对同类型对象/数组递归比较,避免不必要的深度遍历

相关函数

  • deepMerge - 深度合并两个对象,保持指针不变
  • deepAssign - 代替 Object.assign 的深度合并
  • RW - 读写代理,差异路径可直接用于 RW 的引用语法
  • shallowRW - 浅层读写代理