Объекты являются ссылочными типами, поэтому вы не можете просто использовать === или == для сравнения двух объектов. Один из быстрых способов сравнить, имеют ли два объекта одинаковое значение ключа, - использовать JSON.stringify. Другой способ - использовать функцию Lodash isEqual 👏

const k1 = {fruit: '🥝'};
const k2 = {fruit: '🥝'};
// Using JavaScript
JSON.stringify(k1) === JSON.stringify(k2); // true
// Using Lodash
_.isEqual(k1, k2); // true

Глубокое вложенное сравнение

Да, два способа также работают для глубоких вложенных объектов.

const one = {
  fruit: '🥝',
  nutrients: {
    energy: '255kJ',
    minerals: {
      name: 'calcium'
    }
  }
};
const two = {
  fruit: '🥝',
  nutrients: {
    energy: '255kJ',
    minerals: {
      name: 'calcium'
    }
  }
};
// Using JavaScript
JSON.stringify(one) === JSON.stringify(two); // true
// Using Lodash
_.isEqual(one, two); // true

Какой мне использовать?

Это зависит от обстоятельств. Для JSON.stringify() порядок имеет значение. Поэтому, если пара «ключ-значение» упорядочена по-разному в двух объектах, но они одинаковы, она вернет false. Принимая во внимание, что это не имеет значения в Lodash isEqual, он вернет истину, если существует пара "ключ-значение".

Вот моя рекомендация. Для быстрого и грязного решения я бы использовал JSON.stringify(). Но для более надежного решения, охватывающего большее количество странных крайних случаев, используйте способ Lodash.

const one = {
  fruit: '🥝',
  energy: '255kJ',
};
const two = {
  energy: '255kJ',
  fruit: '🥝',
};
// Using JavaScript
JSON.stringify(one) === JSON.stringify(two); // false
// Using Lodash
_.isEqual(one, two); // true

Предложения сообщества

ES6 Способ сравнения 2-х объектов

Это решение, предложенное @ mustafauzun0. Однако следует отметить несколько моментов: он не работает с вложенными объектами, и порядок ключей важен. Идея, лежащая в основе этого, аналогична способу строкового преобразования. Он превращает объект в строку и сравнивает, совпадают ли строки. По сути, это сравнение равенства двух строк. Вот почему порядок имеет значение.

const k1 = {fruit: '🥝'};
const k2 = {fruit: '🥝'};
Object.entries(k1).toString() === Object.entries(k2).toString();
// true

Спасибо: @ mustafauzun0

JSON.stringify против isEqual Performance от Lodash

Коул Тернер:: стоит отметить, что объекты не гарантируют порядок сортировки, а использование строкового преобразования будет стоить дороже с точки зрения производительности, поскольку он должен сериализовать весь объект, тогда как lodash может выйти раньше, если обнаружит несоответствующий ключ. Об этом говорят интервью 🙂

Спасибо: @coleturner

Ресурсы

Делиться

Спасибо за чтение ❤
Подпишитесь на Саманту Минг за НОВЫМИ еженедельными лакомыми кусочками JavaScript, HTML и CSS 🔥🔥

Сказать привет! Instagram | Facebook | Твиттер | SamanthaMing.com