Объекты являются ссылочными типами, поэтому вы не можете просто использовать ===
или ==
для сравнения двух объектов. Один из быстрых способов сравнить, имеют ли два объекта одинаковое значение ключа, - использовать 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
Ресурсы
- Веб-документы MDN - JSON.stringify
- Lodash: isEqual
- Понимание объектов JavaScript
- Равенство объектов в JavaScript
- Сравнение глубоких объектов JavaScript - JSON.stringify vs deepEqual
- Переполнение стека: можно ли использовать JSON.stringify для глубокого сравнения и клонирования?
- Как определить равенство двух объектов JavaScript?
Делиться
- Нравится в Твиттере
- Нравится в Instagram
- Первоначально опубликовано на www.samanthaming.com
Спасибо за чтение ❤
Подпишитесь на Саманту Минг за НОВЫМИ еженедельными лакомыми кусочками JavaScript, HTML и CSS 🔥🔥
Сказать привет! Instagram | Facebook | Твиттер | SamanthaMing.com