@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) && typeof file1[key] === 'object' && typeof file2[key] === 'object') {
      return { key, value: gendiff(file1[key], file2[key]), status: 'have a child' };
    } else if (_.has(file1, key) && _.has(file2, key) && file1[key] !== file2[key]) {
      return { key, value: { oldValue: file1[key], newValue: file2[key] }, status: 'changed' };
    } else 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' };
    }
  });

  return diff;
};

И есть два объекта:

const file1 = {
  workshop: {
    data: '2.0000000',
    locales: 'zh-CN.pak'
  }
};

const file2 = {
  workshop: {
    config: 'd7',
    locales: 'am.pak'
  }
};

Я хотел чтобы эта функция работала рекурсивно. То есть в первом условии если оба ключа равны и у обоих этих ключей свойства равны объектам то функция запускается внутри себя но в качестве аргументов уже приходят эти свойства ключей, то есть тоже объекты. Вывод я ожидал таким:

[{
  key: 'workshop',
  value: [
    { key: 'data', value: '2.0000000', status: 'removed' },
    { key: 'config', value: 'd7', status: 'new' },
    { key: 'locales', value: { oldValue: 'zh-CN.pak', newValue: 'am.pak' }, status: 'changed' }
  ],
  status: 'have a child'
}]

А получил такой:

[{
  key: 'workshop',
  value: { key: 'data', value: '2.0000000', status: 'removed' },
  status: 'have a child'
}]

Что я делаю не так?
  • Вопрос задан
  • 113 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Странно, ваша функция у меня работает правильно.
Функция + has
const has = (object, key) => (key in object);
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) && typeof file1[key] === 'object' && typeof file2[key] === 'object') {
      return { key, value: gendiff(file1[key], file2[key]), status: 'have a child' };
    } else if (has(file1, key) && has(file2, key) && file1[key] !== file2[key]) {
      return { key, value: { oldValue: file1[key], newValue: file2[key] }, status: 'changed' };
    } else 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' };
    }
  });
  
  return diff;
};

console.log(gendiff(
  { workshop: { data: '2.0000000', locales: 'zh-CN.pak' } },
  { workshop: { config: 'd7', locales: 'am.pak' } }
));

/*
[
  {
    key: "workshop",
​​    status: "have a child",
​​    value: [
​​​      { key: "data", value: "2.0000000", status: "removed" },
​​​      {
        key: "locales",
​​​​        status: "changed",
        value: { oldValue: "zh-CN.pak", newValue: "am.pak" },
​​​​      },
      { key: "config", value: "d7", status: "new" },
​​​    ],
  },
]
*/
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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