На третьей неделе Hack Reactor мы столкнулись с этой проблемой алгоритма, напишите функцию, которая принимает два объекта javascript и возвращает true или false в зависимости от структуры каждого соответствующего ключа и свойства.

Во-первых, нам нужно понять, что если два объекта (obj1, obj2) имеют одинаковые ключи и свойства, при использовании «==» или «===» для сравнения будет возвращено значение false. Например:

//Two objects with the same key and property will return False if we //do direct comparison.
var obj1 = { a: 1 };
var obj2 = { a: 1 };
//this will return false
console.log(obj1 === obj2) 

Самый простой способ решить эту проблему — использовать метод JSON.stringify(). JSON.stringify — это встроенный метод, который может помочь нам преобразовать значение Javascript в строку JSON. Пожалуйста, обратитесь к JSON.stringify() в MDN для примеров того, как его использовать. Таким образом, используя JSON.stringify, мы можем преобразовать оба объекта в строку JSON для удобства сравнения. Например:

//Same as previous example, if we first apply JSON.stringify() on //both obj1 & obj2 and compare the result, it will now return True
var obj1 = { a: 1 };
var obj2 = { a: 1 };
obj1 = JSON.stringify(obj1)
console.log(obj1)  ----->>> {“a”:1}
obj2 = JSON.stringify(obj2)
console.log(obj2)  ----->>> {“a”:1}
//this will now return True!
console.log(obj1 == obj2)  ----->>>> True

Без использования JSON.stringify() решить этот алгоритм будет немного сложнее. Одним из хороших решений было бы использование нескольких операторов if и рекурсии. Одна из первых проверок, которую мы можем сделать, — это использовать оператор Javscript typeof (typeof на MDN), чтобы проверить, действительно ли оба переданных аргумента являются объектами. Еще одна вещь, которую мы можем использовать, — это встроенный объектный метод Object.keys(). Он вернет массив со всеми ключами от каждого объекта. Мы можем легко проверить структуру двух объектов, сравнив длину массивов, полученных с помощью Object.keys(). Пожалуйста, обратитесь к Object.keys() на MDN для примеров и объяснений. В конце нам просто нужно использовать цикл for-in для просмотра каждого ключа и значения для сравнения. См. следующую реализацию кода:

function objectComparison(obj1, obj2){
 //check if the two actually have the same value
 if (obj1 === obj2) {
  return true;
 }
 
 //check if both objects are actually 'object' in Javascript
 if (typeof obj1 !== ‘object’ || typeof obj2 !== ‘object’) {
  return false
 }
 //check if objects have the same number of keys
 if (Object.keys(obj1).length !== Object.keys(obj2).length) {
  return false;
 }
 //loop through each key and compare corresponding value
for (var key in obj1) {
  //use recursing to check for nested object
  if(!objectComparison(obj2[key], obj2[key])) {
   return false;
  }
 }
 
 return true;
};