我正在开发一个 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 对象中更改的字段,您可以使用递归方法。以下是如何实现一个函数来实现此目的:
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 测试此函数,以查看更改的字段及其新值。