Функция сравнения
Функция сравнивает два объекта данных неограниченной вложенности и с разными типами данных. Возвращает true в случае, если объекты равны и false — не равны.
function isDataEqual(d1, d2) {
// Если объекты равны по ссылке, они идентичны
if (d1 === d2) return true
// Получаем тип каждого объекта
const type1 = MsTools.getType(d1)
const type2 = MsTools.getType(d2)
// Если типы объектов не совпадают, они не могут быть идентичными
if (type1 !== type2) return false
// Если объекты являются примитивными значениями, сравниваем их значения
if (type1 === 'primitive') return d1 === d2
// Если объекты являются датами, сравниваем их значения
if (type1 === 'date') {
return d1.getTime() === d2.getTime()
}
// Если объекты являются массивами, сравниваем их длины и значения элементов
if (type1 === 'array') {
if (d1.length !== d2.length) return false
for (let i = 0; i < d1.length; i++) {
if (!MsTools.isDataEqual(d1[i], d2[i])) return false
}
return true
}
// Если объекты являются объектами, сравниваем их свойства и их значения
const keys1 = Object.keys(d1)
const keys2 = Object.keys(d2)
if (keys1.length !== keys2.length) return false
for (const key of keys1) {
if (!keys2.includes(key)) return false
if (!MsTools.isDataEqual(d1[key], d2[key])) return false
}
// Если все проверки прошли успешно, объекты идентичны
return true
}
К содержанию ↑
Вспомогательная функция для определения типа объекта:
function getType(value) {
if (value === null) {
return 'null'
}
if (Array.isArray(value)) {
return 'array'
}
if (value instanceof Date) {
return 'date'
}
if (typeof value === 'object') {
return 'object'
}
return 'primitive'
}
Пример использования:
const obj1 = {
a: 1,
b: {
c: [2, 'hello', { d: 4 }] ,
role: 'root'
}
};
const obj2 = {
a: 1,
b: {
c: [2, 'hello', { d: 4 }] ,
role: 'root'
}
};
console.log(areObjectsEqual(obj1, obj2)); // true