【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.

相关推荐
午安~婉16 分钟前
GitHub Token/ GitHub Stats统计显示图异常
前端·github·vercel·github token
码云之上32 分钟前
AI Agent 工程化总览篇:从 Prompt 到 Harness
前端·人工智能
2501_9269783333 分钟前
以说明书 DNA 为模板——完整 AGI 的结构图景
前端·人工智能·经验分享·笔记·ai写作
IT_陈寒43 分钟前
Vite静态资源引用这个坑我踩得有点疼
前端·人工智能·后端
程序员黑豆2 小时前
鸿蒙应用开发:AttributeModifier 使用教程
前端·harmonyos
codeniu2 小时前
TRAE Work 实战 | 从"有个想法"到线上Demo,我全程只靠对话就完成了
前端·trae
妙码生花2 小时前
从 PHP 到 AI + Golang,程序员自救转型手记(五十):增加管理员角色组管理
前端·后端·ai编程
飘尘2 小时前
一文讲清楚前端面试会问到的所有缓存
前端·javascript·面试
老王以为2 小时前
走进 AI Agent
前端·人工智能·架构
酷在前行2 小时前
【R生态】PERMANOVA 进阶实战:距离选择、PERMDISP、两两比较与受限置换(保姆级教程)
开发语言·r语言