如何识别和比较具有嵌套结构的 TypeScript 对象中的更改字段?

问题描述 投票:0回答:1

我正在开发一个 TypeScript 项目,我需要比较两个具有潜在嵌套结构的对象,并识别它们之间已更改的字段。例如,考虑一个旧对象 oldObject,其中包含姓名、年龄、城市、朋友(数组)等字段,以及其中可能嵌套的对象。现在,我有一个具有相同结构的新对象 newObject,但某些字段的值可能会更新。

这是一个例子:

const oldObject = { name: 'John', age: 30, city: 'New York', friends: ['ali', 'qasim'], def: { 'a': 1, 'b': 2 } };
const newObject = { name: 'John', age: 35, city: 'New York', friends: ['ali', 'haider'] };

在这种情况下,我需要能够识别并提取 oldObject 和 newObject 之间更改的字段及其新值,同时保留嵌套结构。

我尝试了比较函数,但它无法正确处理嵌套结构和数组。如何在 TypeScript 中实现一个解决方案,准确识别更改的字段,同时保留对象的嵌套结构?

  • 我正在寻找一种 TypeScript 函数或方法,可以准确识别具有嵌套结构的两个对象之间更改的字段。
  • 该函数应正确处理嵌套对象和数组,识别其中的更改。
  • 该解决方案对于不同大小和复杂性的对象应该是高效且可扩展的。
  • 对所提供的示例功能的任何见解或改进将不胜感激。
  • 清晰的解释和示例将有助于更好地理解和实施。
javascript arrays typescript object data-structures
1个回答
0
投票

要准确识别和比较具有嵌套结构的 TypeScript 对象中更改的字段,您可以使用递归方法。以下是如何实现一个函数来实现此目的:

function findChangedFields(oldObj: any, newObj: any): { old: any, new: any } {
    const changedFields: { old: any, new: any } = { old: {}, new: {} };

    for (const key in oldObj) {
        if (oldObj.hasOwnProperty(key) && newObj.hasOwnProperty(key)) {
            if (Array.isArray(oldObj[key]) && Array.isArray(newObj[key])) {
                if (JSON.stringify(oldObj[key]) !== JSON.stringify(newObj[key])) {
                    changedFields.old[key] = oldObj[key];
                    changedFields.new[key] = newObj[key];
                }
            } else if (typeof oldObj[key] === 'object' && typeof newObj[key] === 'object') {
                const nestedChanges = findChangedFields(oldObj[key], newObj[key]);
                if (Object.keys(nestedChanges.old).length > 0 || Object.keys(nestedChanges.new).length > 0) {
                    changedFields.old[key] = nestedChanges.old;
                    changedFields.new[key] = nestedChanges.new;
                }
            } else {
                if (oldObj[key] !== newObj[key]) {
                    changedFields.old[key] = oldObj[key];
                    changedFields.new[key] = newObj[key];
                }
            }
        }
    }

    return changedFields;
}

// Example usage:
const oldObject = { name: 'John', age: 30, city: 'New York', friends: ['ali', 'qasim'], def: { 'a': 1, 'b': 2 } };
const newObject = { name: 'John', age: 35, city: 'New York', friends: ['ali', 'haider'] };

const changedFields = findChangedFields(oldObject, newObject);
console.log(changedFields);

该函数递归遍历对象和数组来比较它们的元素。如果发现差异,它将在changedFields对象中记录更改的字段及其新值。

您可以使用示例对象 oldObject 和 newObject 测试此函数,以查看更改的字段及其新值。

© www.soinside.com 2019 - 2024. All rights reserved.