Попробовав этот пример, вы почувствовали растерянность в основах Карт и Сет в Javascript - PullRequest
0 голосов
/ 28 июня 2019

Я пытаюсь применить некоторые примеры, чтобы лучше понять разницу между Map и Set, и поведение каждого из них кажется запутанным.Посмотрите на примеры и выходные данные ниже

Пример карты:

let nameMap = new Map([
  ['name', 'stack'],
  ['name', 'overflow'],
  ['domain', 'technology']
]);

// iterate over keys (nameMap)
for (let name of nameMap) {
  console.log(JSON.stringify(name)); 
}

output:

["name","overflow"]
["domain","technology"]

Set Example:

let nameSet = new Set([
  ['name', 'stack'],
  ['name', 'overflow'],
  ['domain', 'technology']
]);

// iterate over keys (nameSet)
for (let name of nameSet) {
  console.log(JSON.stringify(name));
}

output:

["name","stack"]
["name","overflow"]
["domain","technology"]
  1. У меня такой вопрос, почему map возвращает только второй случай появления двух похожих объектов?
  2. Set возвращает все три объекта, даже если первые два ключа и значения совпадают, адолжен удалить один из них.

Ответы [ 3 ]

2 голосов
/ 28 июня 2019

Мой вопрос: почему карта возвращает только второй случай появления двух похожих объектов?

Поскольку карта содержит набор пар ключ-значение. Вы можете иметь только одно значение для каждого ключа. В конструкторе каждый массив представляет [key, value]). Второй бит данных с ключом 'name' перезаписывает первый.

Set возвращает все три объекта, даже если первые два ключа и значения совпадают, в то время как он должен удалить один из них.

Набор хранит набор уникальных значений. Каждый массив (например, ['name', 'stack']) имеет одно значение.

0 голосов
/ 28 июня 2019

A Map - контейнер для пар ключ-значение. В вашем вводе name и domain станут ключами. Поскольку ключ может существовать только один раз, ключ name дедуплицируется.

A Set - это массив значений, который дедуплицирует сами значения. Поскольку в вашем входе нет идентичных значений, все они сохраняются.

0 голосов
/ 28 июня 2019

Потому что Set s похожи на массивы - они просто хранят значения в списке. Следовательно, конструктор добавит все три массива в новый набор в качестве значений. Конструктор Map подобен Object.fromEntries - первый элемент в каждом подмассиве является ключом, а второй - значением. Вы не можете хранить ключи в наборе, только значения - поэтому эти два элемента должны быть абсолютно одинаковыми, а примитив должен быть исключен из набора.

...