38 lines
1.3 KiB
TypeScript
38 lines
1.3 KiB
TypeScript
export function isObjEqual(a: object, b: object): boolean {
|
|
// Сравнение примитивов и null/undefined
|
|
if (a === b) return true
|
|
if (!a || !b) return false
|
|
if (Object.keys(a).length !== Object.keys(b).length) return false
|
|
|
|
// Получаем все уникальные ключи из обоих объектов
|
|
const allKeys = new Set([
|
|
...Object.keys(a),
|
|
...Object.keys(b)
|
|
])
|
|
|
|
// Проверяем каждое свойство
|
|
for (const key of allKeys) {
|
|
const valA = a[key as keyof typeof a]
|
|
const valB = b[key as keyof typeof b]
|
|
|
|
// Если одно из значений undefined - объекты разные
|
|
if (valA === undefined || valB === undefined) return false
|
|
|
|
// Рекурсивное сравнение для вложенных объектов
|
|
if (typeof valA === 'object' && typeof valB === 'object') {
|
|
if (!isObjEqual(valA, valB)) return false
|
|
}
|
|
// Сравнение примитивов
|
|
else if (!Object.is(valA, valB)) {
|
|
return false
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
export function parseIntString (s: string | string[] | undefined) :number | null {
|
|
if (typeof s !== 'string') return null
|
|
const regex = /^[+-]?\d+$/
|
|
return regex.test(s) ? Number(s) : null
|
|
} |