Проверка эквивалентности глубоких объектов (по значению) с использованием рекурсивной функции и различий в печати - PullRequest
0 голосов
/ 21 марта 2019

Я хотел бы написать функцию на чистом Javascript, функция должна сравнивать 2 объекта и обнаруживать различия. Объекты могут содержать массивы и объекты внутри массивов.

В частности, учитывая 3 объекта, показанных в коде ниже:

  • Если я сравниваю firstObject и secondObject, моя функция должна обнаружить, что b.b [1] .b - это «k» вместо «b»
  • Если я сравниваю firstObject и thirdObject, моя функция должна обнаружить, что b.a не существует
  • Порядок ключей в «object2» не должен иметь значения, однако в массивах это имеет значение (В массивах порядок значений внутри массивов должен быть таким же, как в «object1»)

Что я пытаюсь:

//Recursive function
function compare1(object1, object2) {
    Object.keys(object1).forEach(function (k) {
      if (typeof object1 !== 'object') {
          if (object1[k] != object2[k]){
            console.log('Different value found, expected ' + object1[k] + ", found " + object2[k])
          }
      } else {
          compare1(object1[k], object2[k]);
      }
  });
  }

  const firstObject = {
    a: 1,
    b: {
      a: 1,
      b: [4, { a: "a", b: "b" }, 2],
      c: 2
    },
    c: 2,
    d: 3
  };

  const secondObject = {
    a: 1,
    b: {
      a: 1,
      b: [4, { a: "a", b: "n" }, 2],
      c: 2
    },
    c: 2,
    d: 3
  };

  const thirdObject = {
    a: 1,
    b: {

      b: [4, { a: "a", b: "b" }, 2],
      c: 2
    },
    c: 2,
    d: 3
  };

  compare1(firstObject, secondObject);

Этот код печатает:

найдено другое значение, ожидается b, найдено n

Какое поведение ожидается, однако есть 2 вещи, которые я не могу понять

  1. В журнале консоли, показанном выше, я также хотел бы показать положение отличающегося ключа: вместо этого журнал должен быть:

    Найдено другое значение, ожидается b, найдено n в b.b [1] .b

  2. Наличие ключа необходимо проверить перед проверкой на равенство, чтобы при запуске:

    сравнить1 (первый объект, третий объект);

    Консоль должна регистрировать:

    Ключ не найден в b.a

Я знаю, что есть библиотеки JS, которые делают глубокое сравнение объектов, однако я хотел бы сделать это в чистом Javascript

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...