Как сравнить два объекта?
Нужно обработать на фронте,добавлять в объект новый children если он пришел с сервера.
- Вопрос задан более трёх лет назад
- 10794 просмотра
Комментировать
Решения вопроса 0
Ответы на вопрос 3
function deepEqual(obj1, obj2) < if (typeof obj1 !== "object" || typeof obj2 !== "object") < return false; >if (obj1 === undefined || obj2 === undefined) < return false; >if (obj1 === null || obj2 === null) < return false; >let obj1Keys = Object.keys(obj1); let obj2Keys = Object.keys(obj2); if (obj1Keys.length !== obj2Keys.length) < return false; >for (let i = 0; i < obj1Keys.length; i++) < if (obj2Keys.includes(obj1Keys[i]) === false) < return false; >> for (let i = 0; i < obj1Keys.length; i++) < if (typeof obj1[obj1Keys[i]] === "object") < return deepEqual(obj1[obj1Keys[i]], obj2[obj1Keys[i]]); >if (obj1[obj1Keys[i]] !== obj2[obj2Keys[i]]) < return false; >> return true; >
Ответ написан более трёх лет назад
Комментировать
Нравится 2 Комментировать
Сравните два объекта в JavaScript
В этом посте мы обсудим, как сравнить два объекта в JavaScript. Два объекта считаются равными, если оба объекта одного типа, проходят строгое равенство (===) сравнения, и все их свойства равны.
1. Использование библиотеки Lodash/Underscore
С библиотекой lodash или underscore вы можете использовать _.isEqual метод. Он выполняет глубокое сравнение двух объектов, чтобы определить, эквивалентны ли они. Следующий пример кода демонстрирует его использование:
как сравнить объекты js
Поскольку объекты в JavaScript являются ссылочными типами данных, то при использовании как нестрогого равенства == , так и строгого равенства === , сравниваются только ссылки на объекты, а не их содержимое.
Мы можем написать свою функцию для сравнения свойств объекта, но проще и удобнее воспользоваться готовыми инструментами, например, Lodash. Эта библиотека предоставляет множество утилит для работы с объектами, в том числе для сравнения объектов.
Для сравнения объектов с помощью Lodash следует использовать функцию isEqual() . Эта функция позволяет сравнивать два значения и возвращает true , если они равны, и false в противном случае. Пример:
const _ = require('lodash'); const obj1 = a: 1, b: 2 >; const obj2 = a: 1, b: 2 >; const obj3 = a: 1, b: 3 >; console.log(_.isEqual(obj1, obj2)); // true console.log(_.isEqual(obj1, obj3)); // false
Здесь мы использовали функцию isEqual() из библиотеки Lodash для сравнения объектов obj1 и obj2 . Функция вернула true , потому что объекты содержат одинаковые свойства с одинаковыми значениями. Затем мы сравнили объекты obj1 и obj3 , и функция вернула false , т.к. они содержат разные значения свойства b .
Проверка двух объектов на идентичность
Есть задача по 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, , 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, , 4, 5] >, subProp1: 'sub value1' > >;
В чем ошибка? Нужно ли для проверки массивов создавать новую функцию?
Отслеживать
задан 19 авг 2017 в 9:42
11 1 1 золотой знак 1 1 серебряный знак 1 1 бронзовый знак
Легче всего сравнивать строки, поэтому я в своих проектах просто использую JSON.stringify() и уже получившиеся строки сравниваю
– user182722
19 авг 2017 в 10:01
@Masiama дешево и сердито
