Set.prototype.has () возвращает false - PullRequest
1 голос
/ 27 сентября 2019

Я изучаю комплекты ES6.Я пытаюсь добавить массив и проверить его существование в наборе, но он возвращает мне false.Вот код, над которым я работаю.

const set = new Set();
set.add(1);
set.add([2, 3]);
set.add([2, 3]);

console.log(set);
console.log(set.has([2, 3]));

Пожалуйста, кто-нибудь может объяснить это поведение.

Ответы [ 2 ]

1 голос
/ 27 сентября 2019

Когда Set содержит объект, .has() определяет, содержит ли Набор тот же самый точный объект, а не содержит ли Набор объект, который содержит те же данные, что и какой-либо другой объект.Он должен содержать один и тот же объект.

Итак, .has(someObj) или .has(someArray) возвращает true, только если этот фактический объект находится в Set.Он не сравнивается, чтобы увидеть, есть ли похожий объект с одинаковыми значениями / свойствами в Set, только если сам фактический объект находится в Set.

Он работает аналогично сравнению двух объектов с=== как и в obj1 === obj2.

Если вы хотите что-то с функциями, похожими на Set, которое сообщит вам, если у него есть какой-либо другой объект, совпадающий с текущим, вам придется написать другую коллекциюсебя и реализовать свой собственный алгоритм сравнения.Это не то, как Set или Map работают.

Вы можете увидеть некоторые другие обсуждения аналогичной темы здесь: Как настроить равенство объектов для JavaScript Set

0 голосов
/ 27 сентября 2019

Это должно работать:

const set = new Set();
const array = [ 2, 3 ];
set.add(1);
set.add(array);
set.add(array);

console.log(set);
console.log(set.has(array));

В Set # есть проверки на идентичность объекта, а не на глубокое равенство.Это отличается, скажем, от HashMap Java, который использует Object # equals в фоновом режиме.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...