Как сравнить два объекта
Короткий ответ
Для плоских объектов сравните число ключей и значение каждого ключа:
const shallowEqual = (a, b) => {
const keys = Object.keys(a);
return keys.length === Object.keys(b).length && keys.every((key) => a[key] === b[key]);
};
console.log(shallowEqual({ x: 1, y: 2 }, { y: 2, x: 1 }));
console.log(shallowEqual({ x: 1 }, { x: 2 }));Результат:
true
falseВложенные объекты
Рекурсивная функция заходит во вложенные объекты и массивы:
const deepEqual = (a, b) => {
if (a === b) return true;
if (typeof a !== 'object' || typeof b !== 'object' || a === null || b === null) return false;
const keys = Object.keys(a);
return keys.length === Object.keys(b).length && keys.every((key) => deepEqual(a[key], b[key]));
};
console.log(deepEqual({ user: { tags: ['a', 'b'] } }, { user: { tags: ['a', 'b'] } }));
console.log(deepEqual({ user: { tags: ['a'] } }, { user: { tags: ['b'] } }));Результат:
true
falseЧерез JSON
Сравнение JSON-строк короткое, но зависит от порядка ключей:
console.log(JSON.stringify({ a: 1, b: 2 }) === JSON.stringify({ a: 1, b: 2 }));
console.log(JSON.stringify({ a: 1, b: 2 }) === JSON.stringify({ b: 2, a: 1 }));Результат:
true
falseЧастая ошибка
=== и == сравнивают объекты по ссылке: они равны, только если обе переменные указывают на один объект:
const a = { x: 1 };
const b = { x: 1 };
const c = a;
console.log(a === b, a === c);Результат:
false trueФункции из этого ответа
- Object.keys — Возвращает массив имён свойств объекта.
- JSON.stringify — Преобразует значение в строку в формате JSON.