Концепция: сравнение объектов и массивов, таких как строки и числа в 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, можно использовать для генерации уникального хэша объекта.

Вот сторонняя библиотека, которую я использовал раньше, чтобы генерировать хеши объектов.

Другие вопросы по тегам