Перейти к содержимому

Как сравнить два объекта js

  • автор:

как сравнить объекты 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 .

Как сравнить два объекта?

Нужно обработать на фронте,добавлять в объект новый children если он пришел с сервера.

  • Вопрос задан более трёх лет назад
  • 10870 просмотров

Комментировать

Решения вопроса 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 объекты всегда хранятся по ссылке. Это означает, что один объект строго равен другому, только если они оба указывают на один и тот же объект в памяти.

const o1 = < answer: 42 >;
const o2 = o1;
const o3 = < answer: 42 >;

o1 === o2; // true, ссылаются на один объект
o1 === o3; // false, разные ссылки, но идентичные свойства и значения свойств

Однако что, если вы хотите проверить, имеют ли два объекта идентичные ключи и значения? Есть 3 подхода.

Сравнить ключи и значения на прямую

Один простой подход — перебрать каждый ключ и значение в двух объектах и проверить их равенство.

const o1 = < question: null, answer: 42 >;
const o2 = < question: null, answer: 42 >;

objectsEqual(o1, o2); // true
objectsEqual(o1, < answer: 43 >); // false

function objectsEqual(o1, o2) const entries1 = Object.entries(o1);
const entries2 = Object.entries(o2);
if (entries1.length !== entries2.length) return false;
>
for (let i = 0; i < entries1.length; ++i) // Ключи
if (entries1[i][0] !== entries2[i][0]) return false;
>
// Значения
if (entries1[i][1] !== entries2[i][1]) return false;
>
>

return true;
>

Использовать JSON.stringify()

В предыдущем методе показано, как сравнивать объекты, проверяя, строго ли равны ключи и значения двух объектов. Но что, если одно из значений ключа — объект?

const o1 = < name: < first: 'Arthur', lastName: 'Dent' >, planet: 'Earth' >;
const o2 = < name: < first: 'Arthur', lastName: 'Dent' >, planet: 'Earth' >;

objectsEqual(o1, o2); // false, потому что `o1.name !== o2.name`

Вы можете сделать objectsEqual() рекурсивным, но в таком случае нужно быть осторожным с бесконечной рекурсией. Простой способ сравнить, являются ли два POJO полностью равными, — это сравнить их представления JSON с помощью JSON.stringify()

const o1 = < name: < first: 'Arthur', lastName: 'Dent' >, planet: 'Earth' >;
const o2 = < name: < first: 'Arthur', lastName: 'Dent' >, planet: 'Earth' >;

JSON.stringify(o1) === JSON.stringify(o2); // true

delete o2.planet;
JSON.stringify(o1) === JSON.stringify(o2); // false

Функция JSON.stringify() имеет несколько ограничений, которые делают ее не универсальным выбором для проверки полного равенства. Во-первых, важен порядок определения свойств:

const o1 = < question: null, answer: 42 >;
const o2 = < answer: 42, question: null >;
JSON.stringify(o1) === JSON.stringify(o2); // false

Во-вторых, не все типы могут быть представлены в JSON. Функция JSON.stringify() преобразует даты в строки и игнорирует ключи, значения которых не определены, что может привести к неожиданным результатам.

const o1 = < myDate: new Date('2016-06-01'), otherProperty: undefined >;
const o2 = < myDate: '2016-01-01T00:00:00.000Z' >;

JSON.stringify(o1) === JSON.stringify(o2); // false

Использовать Lodash isEqual()

isEqual() — это наиболее изощренный способ сравнения двух объектов. Он обрабатывает широкий спектр крайних случаев и избегает многих ошибок предыдущих двух подходов.

const obj1 = date: new Date('2020/06/01'), 
num: new Number(1)
>;
const obj2 = date: new Date('2020/06/01'),
num: 1
>;

_.isEqual(obj1, obj2); // true
const obj1 = < name: 'Will Riker', rank: 'Commander' >;

class Character <>
const obj2 = new Character();
Object.assign(obj2, < name: 'Will Riker', rank: 'Commander' >);

_.isEqual(obj1, obj2); // false

Функция также достаточно хорошо избегает бесконечных рекурсий

const obj1 = <>;
const obj2 = <>;

obj1.circular = obj1;
obj2.circular = obj1;

_.isEqual(obj1, obj2); // true

Если вы уже используете Lodash, isEqual() — лучший способ сравнения, двух объектов. Первый подход хорош для случаев, когда вы не беспокоитесь о вложенных объектах, а JSON.stringify () может помочь обеспечить грубую глубокую проверку равенства в тех случаях, когда вы не можете использовать Lodash. Но, если вы можете использовать Lodash, isEqual() — лучший подход для сравнения двух объектов.

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

Есть задача по 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 дешево и сердито

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *