对比两个json对象有那几个字段被修改,并返回有改动的字段内容

 如果您想比较两个 JSON 对象,找出哪些字段发生了变化,并返回发生变化的字段及其新的值,您可以编写一个函数来递归比较对象。以下是一个 TypeScript 示例:

type JSONValue = string | number | boolean | null | JsonObject | JsonArray;
interface JsonObject {
  [key: string]: JSONValue;
}
type JsonArray = JSONValue[];

function compareObjects(obj1: JsonObject, obj2: JsonObject): JsonObject {
  const changedFields: JsonObject = {};

  for (const key in obj1) {
    if (obj1.hasOwnProperty(key)) {
      const value1 = obj1[key];
      const value2 = obj2[key];

      if (isObject(value1) && isObject(value2)) {
        // 递归比较嵌套的对象
        const nestedChanges = compareObjects(value1, value2);
        if (Object.keys(nestedChanges).length > 0) {
          changedFields[key] = nestedChanges;
        }
      } else if (!isEqual(value1, value2)) {
        // 如果值不相等,记录变化
        changedFields[key] = value2;
      }
    }
  }

  // 检查 obj2 中新增的字段
  for (const key in obj2) {
    if (obj2.hasOwnProperty(key) && !obj1.hasOwnProperty(key)) {
      changedFields[key] = obj2[key];
    }
  }

  return changedFields;
}

// 判断是否为对象
function isObject(value: any): value is JsonObject {
  return typeof value === 'object' && value !== null && !Array.isArray(value);
}

// 判断两个值是否相等
function isEqual(value1: JSONValue, value2: JSONValue): boolean {
  if (isObject(value1) && isObject(value2)) {
    return compareObjects(value1, value2).length === 0;
  }
  return value1 === value2;
}

// 示例
const json1: JsonObject = { a: 1, b: { c: 2, d: 3 } };
const json2: JsonObject = { a: 1, b: { c: 5, d: 3 }, e: 'newField' };

const changes = compareObjects(json1, json2);
console.log(changes);

这个函数 compareObjects 将递归比较两个对象,并返回发生变化的字段及其新值。在示例中,changes 对象将包含 { b: { c: 5 }, e: 'newField' },表示字段 b 中的 c 值发生了变化,以及新添加了字段 e。您可以根据实际需求调整这个函数。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-13 23:26:03       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-13 23:26:03       101 阅读
  3. 在Django里面运行非项目文件

    2024-01-13 23:26:03       82 阅读
  4. Python语言-面向对象

    2024-01-13 23:26:03       91 阅读

热门阅读

  1. MyBatis面试题及高级用法

    2024-01-13 23:26:03       55 阅读
  2. AI监控技术与应用案例

    2024-01-13 23:26:03       61 阅读
  3. Rust变量、常量声明与基本数据类型

    2024-01-13 23:26:03       63 阅读
  4. 聊聊PowerJob的UseCacheLock

    2024-01-13 23:26:03       66 阅读
  5. 设计模式-工厂方法模式

    2024-01-13 23:26:03       62 阅读
  6. 计算机体系中程序、进程与线程的关系解读

    2024-01-13 23:26:03       65 阅读
  7. 如何建立正确的文献阅读习惯

    2024-01-13 23:26:03       56 阅读
  8. 排序算法-快速排序

    2024-01-13 23:26:03       70 阅读
  9. 基于视觉定位技术选型

    2024-01-13 23:26:03       74 阅读
  10. 知识笔记(七十六)———链式语句中limit用法

    2024-01-13 23:26:03       64 阅读