Здравствуйте! У меня есть функция, которая принимает на вход два объекта и сравнивает их:
const gendiff = (file1, file2) => {
const mergeFiles = { ...file1, ...file2 };
const uniqueKeys = Object.keys(mergeFiles);
const diff = uniqueKeys.map(key => {
if (_.has(file1, key) && !_.has(file2, key)) {
return { key, value: file1[key], status: 'removed' };
} else if (!_.has(file1, key) && _.has(file2, key)) {
return { key, value: file2[key], status: 'new' };
} else if (_.has(file1, key) && _.has(file2, key) && file1[key] === file2[key]) {
return { key, value: file1[key], status: 'same' };
} else if (_.has(file1, key) && _.has(file2, key) && file1[key] !== file2[key]) {
return { key, value: { oldValue: file1[key], newValue: file2[key] }, status: 'changed' };
}
});
const abbreviatedDiff = diff.map(obj => {
if (obj.status === 'removed') {
return ` - ${obj.key}: ${obj.value}`;
} else if (obj.status === 'new') {
return ` + ${obj.key}: ${obj.value}`;
} else if (obj.status === 'same') {
return ` ${obj.key}: ${obj.value}`;
} else if (obj.status === 'changed') {
return ` - ${obj.key}: ${obj.value.oldValue}\n + ${obj.key}: ${obj.value.newValue}`;
}
});
return abbreviatedDiff.map(key => console.log(key))
};
Функция работает только для объектов плоской структуры, но мне нужно, чтобы сравнение работало и для объектов древовидной структуры, например есть два объекта:
const obj1 = {
common: {
key: 'value',
setting: 1,
setting2: 2
},
group: false
};
const obj2 = {
common: {
key: 'value',
setting: 555,
setting2: 2,
},
group: true
};
А вывод должен быть таким:
common: {
key: value
- setting: 1
+ setting: 555
setting2: 2
}
- group: false
+ group: true
Подскажите алгоритм пожалуйста.