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

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

javascript 复制代码
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。您可以根据实际需求调整这个函数。

相关推荐
楚轩努力变强3 小时前
iOS 自动化环境配置指南 (Appium + WebDriverAgent)
javascript·学习·macos·ios·appium·自动化
Aliex_git3 小时前
跨域请求笔记
前端·网络·笔记·学习
John_ToDebug3 小时前
引擎深处的漫游者:构建浏览器JavaScript引擎的哲学与技艺
javascript·chrome·js
37方寸3 小时前
前端基础知识(Node.js)
前端·node.js
程序猿阿伟3 小时前
《TypeScript中Protobuf到运行时类型安全的转换指南》
javascript·安全·typescript
powerfulhell3 小时前
寒假python作业5
java·前端·python
木子啊4 小时前
前端组件化:模板继承拯救发际线
前端
三十_A4 小时前
零基础通过 Vue 3 实现前端视频录制 —— 从原理到实战
前端·vue.js·音视频
前端小菜袅4 小时前
PC端原样显示移动端页面方案
开发语言·前端·javascript·postcss·px-to-viewport·移动端适配pc端
Highcharts.js4 小时前
如何使用Highcharts SVG渲染器?
开发语言·javascript·python·svg·highcharts·渲染器