Пошук уроків, статей та іншого контенту
Перевірте структурну рівність двох значень, включно з вкладеними об'єктами.
Напишіть функцію solve(a, b), яка повертає true, якщо два значення структурно однакові — рекурсивно, на будь-яку глибину вкладеності об'єктів і масивів, — і false інакше. Примітиви порівнюються звичайним ===. Ця сама задача постає в React, коли потрібно порівняти попереднє й нове значення в масиві залежностей useEffect/useMemo глибше, ніж стандартне поверхневе порівняння за посиланням.
Приклади
Вхід: { a: 1, b: { c: 2 } }, { a: 1, b: { c: 2 } }
Вихід: true
структурно однакові, хоча це різні об'єкти в пам'яті
Вхід: { a: 1 }, { a: 2 }
Вихід: false
Вхід: [1, 2, 3], [1, 2, 3]
Вихід: true
Ваше рішення
Підказки
Базовий випадок рекурсії: якщо a === b (те саме примітивне значення чи те саме посилання), вони точно рівні.
Якщо хоч одне зі значень не є об'єктом (чи є null), а === b уже все вирішило б — інакше вони не рівні.
Порівняйте кількість ключів обох об'єктів, а потім рекурсивно порівняйте значення під кожним ключем.
function solve(a, b) {
if (a === b) return true;
if (typeof a !== "object" || typeof b !== "object" || a === null || b === null) {
return false;
}
const keysA = Object.keys(a);
const keysB = Object.keys(b);
if (keysA.length !== keysB.length) return false;
return keysA.every((key) => solve(a[key], b[key]));
}Якщо значення строго рівні (===) — готово, включно з примітивами. Якщо хоч одне не об'єкт чи null — вони точно не рівні (бо строга рівність уже не спрацювала). Інакше рекурсивно порівнюються значення під кожним ключем — Object.keys працює однаково для звичайних об'єктів і масивів.