Глубокое сравнение объектов с использованием рекурсии - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь выполнить глубокое сравнение объектов с помощью рекурсии, но моя функция возвращает undefined.

. Я знаю, что есть лучшие способы сравнения объектов (IE JSON.Stringify()), но я не понимаю, почемумоя функция возвращает undefined.

function deepObjCompare(obj1, obj2) {

  Object.keys(obj1).forEach((key) => {
    const key1 = obj1[key];
    const key2 = obj2[key];

    if (key2) {
      if (typeof key1 === "object" && key1 !== null) {
        deepObjCompare(key1, key2);
      } else if (key1 === key2) {
        return true;
      }
    }
    return false;
  });
}

const obj1 = {
  name: "Bill",
  address: {
    cityNow: "Paris",
    cityFuture: "NYC"
  },
  age: 39
};

const obj2 = {
  name: "Bill",
  address: {
    cityNow: "Paris",
    cityFuture: "NYC"
  },
  age: 39
};

const obj3 = {
  name: "Bob",
  address: "Paris",
  age: 39
};

console.log(deepObjCompare(obj1, obj3));

Ответы [ 3 ]

0 голосов
/ 26 сентября 2018

Здесь я вижу три основных проблемы:

  • deepObjCompare не хватает оператора return, поэтому он неявно возвращает undefined.
  • Метод .forEach всегдавозвращает undefined, поэтому вы захотите изменить это на другой метод, который будет возвращать фактическое значение.Я думаю, что .every - это то, что вам нужно здесь.
  • Вы не вернете результат своего рекурсивного вызова.

Все вместе, это изменит ваш фрагмент на следующий:

function deepObjCompare(obj1, obj2) {

  return Object.keys(obj1).every((key) => { // Use .every and return the result!
    const key1 = obj1[key];
    const key2 = obj2[key];

    if (key2) {
      if (typeof key1 === "object" && key1 !== null) {
        return deepObjCompare(key1, key2); // Return the result of your recursive call!
      } else if (key1 === key2) {
        return true;
      }
    }
    return false;
  });
}

const obj1 = {
  name: "Bill",
  address: {
    cityNow: "Paris",
    cityFuture: "NYC"
  },
  age: 39
};

const obj2 = {
  name: "Bill",
  address: {
    cityNow: "Paris",
    cityFuture: "NYC"
  },
  age: 39
};

const obj3 = {
  name: "Bob",
  address: "Paris",
  age: 39
};

console.log(deepObjCompare(obj1, obj3)); // false
console.log(deepObjCompare(obj1, obj2)); // true
0 голосов
/ 26 сентября 2018

На самом деле я вижу ряд вещей, которые не подходят для этой реализации.Но что касается того, почему он возвращает undefined - это потому, что ваша функция на самом деле никогда не return ничего.Все ваши операторы return находятся внутри функции, переданной в forEach, и поэтому ничего не делают в отношении внешнего deepObjCompare.

0 голосов
/ 26 сентября 2018

Вы не можете вернуться из цикла forEach, и вы должны вернуть рекурсивный вызов:

function deepObjCompare(obj1, obj2) {

  let keys = Object.keys(obj1);
  return keys.every((key) => { // use a for-of loop instead of forEach
    const key1 = obj1[key];
    const key2 = obj2[key];

    if (key2) {
      if (typeof key1 === "object" && key1 !== null) {
         return deepObjCompare(key1, key2); // return the recursive call
      } else if (key1 === key2) {
        return true;
      }
    }
    return false;
  });
}

const obj1 = {name: "Bill",address: {cityNow: "Paris",cityFuture: "NYC"},age: 39};
const obj2 = {name: "Bill",address: {cityNow: "Paris",cityFuture: "NYC"},age: 39};
const obj3 = {name: "Bill",address: "Paris",age: 39};

console.log("Are Obj1 and Obj3 equal? ",deepObjCompare(obj1, obj3));
console.log("Are Obj1 and Obj2 equal? ",deepObjCompare(obj1, obj2));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...