【Javascript】jsondiffpatch检测到子节点改变了,父节点会标记为改变吗?

答案是:No

但是你也有办法检查哪些父节点受到改变的影响,具体分析如下:

jsondiffpatch is designed to be very granular and identifies changes at the most specific path possible.

If a sub-node changes, the parent node itself is not explicitly identified as "changed" in the jsondiffpatch delta. The delta will only show the specific change at the path of the sub-node.

Why?

jsondiffpatch aims for minimal, atomic changes. It doesn't generate a "cascading" change report up the object tree. It pinpoints the exact property or array element that was added, removed, or modified.

Example

Let's illustrate this with an example:

javascript 复制代码
const jsondiffpatch = require('jsondiffpatch').create();

const originalJson = {
  "id": 1,
  "name": "Product A",
  "details": {
    "price": 100,
    "currency": "USD",
    "dimensions": {
      "width": 10,
      "height": 20
      // "depth": 5 // uncomment to see another type of change
    }
  },
  "tags": ["electronics", "gadget"]
};

const modifiedJson = {
  "id": 1,
  "name": "Product A",
  "details": {
    "price": 100,
    "currency": "USD",
    "dimensions": {
      "width": 12, // <--- This sub-node changed
      "height": 20
    }
  },
  "tags": ["electronics", "gadget"]
};

const delta = jsondiffpatch.diff(originalJson, modifiedJson);

console.log("Original JSON:\n", JSON.stringify(originalJson, null, 2));
console.log("\nModified JSON:\n", JSON.stringify(modifiedJson, null, 2));
console.log("\nDelta (changes):\n", JSON.stringify(delta, null, 2));

// --- Let's also check if 'details' or 'dimensions' objects are marked as direct changes ---
// (They won't be)
const detailsDelta = delta && delta.details;
const dimensionsDelta = detailsDelta && detailsDelta.dimensions;

console.log("\nIs 'details' itself in the delta (as a modified object)?", !!detailsDelta && Object.keys(detailsDelta).length > 0);
console.log("Is 'dimensions' itself in the delta (as a modified object)?", !!dimensionsDelta && Object.keys(dimensionsDelta).length > 0);

if (delta) {
  // To check if a specific parent was "affected", you'd look for its properties in the delta.
  const detailsAffected = 'details' in delta;
  const dimensionsAffected = 'details' in delta && 'dimensions' in delta.details;
  const widthAffected = 'details' in delta && 'dimensions' in delta.details && 'width' in delta.details.dimensions;

  console.log("\nProgrammatic check:");
  console.log("'details' node path is present in delta:", detailsAffected);
  console.log("'dimensions' node path is present in delta:", dimensionsAffected);
  console.log("'width' node path is present in delta:", widthAffected);
}

Output Explanation:

复制代码
Original JSON:
 {
  "id": 1,
  "name": "Product A",
  "details": {
    "price": 100,
    "currency": "USD",
    "dimensions": {
      "width": 10,
      "height": 20
    }
  },
  "tags": [
    "electronics",
    "gadget"
  ]
}

Modified JSON:
 {
  "id": 1,
  "name": "Product A",
  "details": {
    "price": 100,
    "currency": "USD",
    "dimensions": {
      "width": 12,
      "height": 20
    }
  },
  "tags": [
    "electronics",
    "gadget"
  ]
}

Delta (changes):
 {
  "details": {
    "dimensions": {
      "width": [
        10,
        12
      ]
    }
  }
}

Is 'details' itself in the delta (as a modified object)? true
Is 'dimensions' itself in the delta (as a modified object)? true

Programmatic check:
'details' node path is present in delta: true
'dimensions' node path is present in delta: true
'width' node path is present in delta: true

As you can see from the Delta (changes) output:

  1. The delta object has a details property.
  2. Inside details, it has a dimensions property.
  3. Inside dimensions, it has a width property, which shows the actual change [10, 12].

jsondiffpatch doesn't report details as being replaced by a new details object, nor dimensions as being replaced. It just shows that something inside details.dimensions.width changed.

How to interpret "parent affected":

While the parent itself isn't marked as replaced, its path is present in the delta object if any of its children (or children's children, etc.) have changed.

So, if you want to know if details was "affected," you would check if delta.details exists and has any properties (indicating changes within it). If delta.details.dimensions exists, then dimensions was affected. If delta.details.dimensions.width exists and contains a change array, then width itself changed.

相关推荐
少年姜太公4 小时前
什么?还不知道git cherry pick?
前端·javascript·git
白兰地空瓶6 小时前
🏒 前端 AI 应用实战:用 Vue3 + Coze,把宠物一键变成冰球运动员!
前端·vue.js·coze
长安第一美人6 小时前
C 语言可变参数(...)实战:从 logger_print 到通用日志函数
c语言·开发语言·嵌入式硬件·日志·工业应用开发
Larry_Yanan6 小时前
Qt多进程(一)进程间通信概括
开发语言·c++·qt·学习
superman超哥7 小时前
仓颉语言中基本数据类型的深度剖析与工程实践
c语言·开发语言·python·算法·仓颉
Liu.7747 小时前
vue3使用vue3-print-nb打印
前端·javascript·vue.js
不爱吃糖的程序媛7 小时前
Ascend C开发工具包(asc-devkit)技术解读
c语言·开发语言
bu_shuo7 小时前
MATLAB奔溃记录
开发语言·matlab
你的冰西瓜7 小时前
C++标准模板库(STL)全面解析
开发语言·c++·stl
松涛和鸣8 小时前
Linux Makefile : From Basic Syntax to Multi-File Project Compilation
linux·运维·服务器·前端·windows·哈希算法