Проверка двух объектов на идентичность

383
21 августа 2017, 11:08

Есть задача по JavaScript

Нужно полностью сравнить два объекта на идентичность их свойств. Порядок свойств в объекте не важен. Если значением какого-то свойства объекта является массив или объект, то начать сверять и их у обоих объектов.

Объект в свойстве другого объекта нужно сверять рекурсивно.

При сверке объектов - последовательность свойств не важна, но при сверке массивов, важна последовательность элементов, то есть массивы: [1,2,3,4] и [2,1,3,4] не равны, так как, хотя и имеют одинаковые значения, отличаются в последовательности этих значений.

Полного сравнения объектов я смог добиться, но если в свойстве объекта массив, то каким бы он не был всегда возвращается true. Свойства сравнивал через valueOf для того случая, если свойством будет дата, что бы она сравнивалась корректно.

function deepEqual (obj1, obj2){
if(obj1 === obj2){
     return true;
 }
 else{
     if(Object.keys(obj1).length != Object.keys(obj2).length){ // Проверка на одинаковое количество свойств
         return false;
     }
     for(var propName in obj1){
         if (! obj2.hasOwnProperty(propName)) { // Есть ли свойства в обоих объектах
             return false;
         }
         if(obj1[propName].valueOf() !== obj2[propName].valueOf()){ // Одинаковы ли значения свойст 
             if(! deepEqual(obj1[propName], obj2[propName]) ){ // проверка объекта в объекте
                 return false;
             }
        }
     }
 } 
 return true; }

Вот данные для проверки

Первый объект

 var objA = {
prop1: 'value1',
prop2: 'value2',
prop3: 'value3',
prop4: {
    subProp1: 'sub value1',
    subProp2: {
        subSubProp1: 'sub sub value1',
        subSubProp2: [1, 2, {prop2: 1, prop: 2}, 4, 5]
    }
},
prop5: 1000,
prop6: new Date(2016, 2, 10) };

Второй объект

 var objB = {
prop5: 1000,
prop3: 'value3',
prop1: 'value1',
prop2: 'value2',
prop6: new Date('2016/03/10'),
prop4: {
    subProp2: {
        subSubProp1: 'sub sub value1',
        subSubProp2: [1, 2, {prop2: 1, prop: 2}, 4, 5]
    },
    subProp1: 'sub value1'
}  };

В чем ошибка? Нужно ли для проверки массивов создавать новую функцию?

Answer 1

сверить 2 объекта можно одной строчкой:

function deepEqual (obj1, obj2){
   return JSON.stringify(obj1)===JSON.stringify(obj2);
}
READ ALSO
Некорректная работа setInterval

Некорректная работа setInterval

Всем привет! Пытаюсь создать игру(кликер)Кликая на настройки(settings), запускается функция, в которую вложены еще несколько функций

254
Вырезать url адрес изображения

Вырезать url адрес изображения

Подскажите регулярку, чтоб вырезать из строки url("/images/imagepng"); ссылку на изображение

242
Firebase. Добавление своих данных

Firebase. Добавление своих данных

Здравствуйте, ребятаУ меня такой вопрос

337
JS AJAX - как узнать, в чем моя ошибка? Возвращает SyntaxError: Unexpected end of JSON input

JS AJAX - как узнать, в чем моя ошибка? Возвращает SyntaxError: Unexpected end of JSON input

Вот код https://jsfiddlenet/f9e0khoo/ Здесь только JS, потому что все равно без БД работать не будет

296