deepDiff
deepDiff方法用于查询两个 JSON 对象的差异值,返回一个差异对象,键为路径(使用 #/key/ 格式,与 RW 的引用语法一致),值为 { left, right } 结构,分别记录 json1 和 json2 中的值。
语法
javascript
deepDiff(json1, json2)描述
deepDiff方法递归地比较两个 JSON 对象,找出所有不同的值。返回的差异对象中,每个键表示一个差异路径,对应的值为 { left, right } 对象,left 为 json1 中的值,right 为 json2 中的值。
路径格式遵循以下规则:
- 根层级的键直接使用键名,如
name - 嵌套层级的键使用
#/key/引用语法,如#/info/version - 当某一侧不存在该键时,对应的
left或right为undefined
该函数仅对同类型的对象或数组进行递归比较;对于类型不一致或非对象/数组的属性,直接通过严格不等(!==)判断差异。依赖 ramda 的 type 进行类型判断。
参数
json1 object
比较的第一个 JSON 对象,差异结果中其值记录在 left 字段。
json2 object
比较的第二个 JSON 对象,差异结果中其值记录在 right 字段。
返回值
object 返回一个差异对象。键为差异路径(根层级为键名,嵌套层级使用 #/key/ 格式),值为 { left, right } 对象。
注意事项
- 路径格式使用
#/key/语法,与 RW 的引用语法一致,可直接用于 RW 代理的读写操作 - 根层级的键名不带
#/前缀,直接使用键名作为差异对象的键 - 嵌套层级的键名使用
#/parent/key格式,逐层用/分隔 - 仅对同类型的对象(Object)或数组(Array)进行递归比较,类型不一致时直接判定为差异
- 对于基本类型值,使用严格不等(
!==)进行比较 - 仅在
json1中存在的键,差异结果中right为undefined;仅在json2中存在的键,left为undefined - 依赖 ramda 的
type进行类型判断
示例
基础用法
嵌套对象差异
数组差异
浏览器兼容
deepDiff 函数在所有现代浏览器中均可使用,不依赖任何浏览器特定 API。
性能考虑
- 时间复杂度: O(n) - 需要遍历两个对象的所有键,其中 n 为对象属性总数
- 空间复杂度: O(d + m) - 递归调用栈深度为对象嵌套深度 d,差异对象存储 m 个差异项
- 使用 ramda 的
type进行类型判断,开销较小 - 仅对同类型对象/数组递归比较,避免不必要的深度遍历
相关函数
- deepMerge - 深度合并两个对象,保持指针不变
- deepAssign - 代替 Object.assign 的深度合并
- RW - 读写代理,差异路径可直接用于 RW 的引用语法
- shallowRW - 浅层读写代理