@iharaleynikov

Нужно написать алгоритм для функции, чтобы она работала и для древовидных объектов, как это сделать?

Здравствуйте! У меня есть функция, которая принимает на вход два объекта и сравнивает их:

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


Подскажите алгоритм пожалуйста.
  • Вопрос задан
  • 75 просмотров
Решения вопроса 1
longclaps
@longclaps
Тебе уже помогали, но это не помогло. Ты даже не попытался имплементировать рекурсию.
Ты даже с примером накосячил, многократно.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы