На третьей неделе 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; };