Сравнение двух объектов JS. - IZIART

Разработка сайтов
индивидуальный дизайн

Главная » JS » Сравнение двух объектов JS.

Сравнение двух объектов JS.

Обновлено: 05.10.2023
js

Функция сравнения

Функция сравнивает два объекта данных неограниченной вложенности и с разными типами данных. Возвращает 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