Концепция: сравнение объектов и массивов, таких как строки и числа в JavaScript
Есть ли способ сравнить два объекта, на которые нет ссылок, по их буквальному значению, например, строке или числу?
_is = function (a, b) { /* Code */ }
Это может относиться к любому типу объекта, даже к пользовательским объектам.
_is(new X("a"), new X("a")); // Returns True;
_is(new X("a"), new Y("a")); // Returns False
Вы могли бы преобразовать это в строку, но это было бы небрежно.
JSON.stringify({ x: "a" }) == JSON.stringify({ x: "a" }); // Returns True
Возможно, есть способ программно прочитать каждый ключ, подраздел и значение объекта и сравнить таким образом.
Есть идеи?
1 ответ
Javascript хеширует объекты в памяти с помощью уникальных указателей памяти. По сути, вы создаете два отдельных объекта и пытаетесь сравнить их. Несмотря на то, что они похожи, они на самом деле разные.
Попробуйте сначала сохранить объект как переменную, а затем проверить ее.
pass = arg => { return arg }; pass({ a: "x" }); // Returns The Input
pass(({ a: "x" })) == ({ a: "x" }); // Returns False
var obj = {a: "x"};
pass(obj) === (obj); // Returns true
console.log(pass(obj) === (obj));
ОБНОВИТЬ:
Если вы хотите сравнить два отдельных объекта, лучший и наиболее эффективный способ, который я нашел, - это создать хэш обоих объектов, а затем сравнить их (в основном сравнивая две контрольные суммы). Если хэши совпадают, объекты совпадают. Если хэши различаются, это разные объекты. Можно предположить, что свойства и значения одинаковы в каждом объекте, поскольку при использовании функции хеширования даже функции хеширования, используемые в некоторых формах криптографии, таких как md5 и sha, можно использовать для генерации уникального хэша объекта.
Вот сторонняя библиотека, которую я использовал раньше, чтобы генерировать хеши объектов.