---
sidebar_position: 6
---

# Map и Set
Отличия от обычного объекта **`Object`**:
- Что угодно может быть ключом, в том числе и объекты.
- Есть дополнительные методы, свойство **`size`**.

**`Set`** – коллекция уникальных значений, так называемое «множество».

## Map
**`Map`** – это коллекция ключ/значение, как и **`Object`**. Но основное отличие в том, что **`Map`** позволяет использовать ключи любого типа.

Методы и свойства:

- **new Map()** – создаёт коллекцию.
- **map.set(key, value)** – записывает по ключу key значение value.
- **map.get(key)** – возвращает значение по ключу или undefined, если ключ key отсутствует.
- **map.has(key)** – возвращает true, если ключ key присутствует в коллекции, иначе false.
- **map.delete(key)** – удаляет элемент (пару «ключ/значение») по ключу key.
- **map.clear()** – очищает коллекцию от всех элементов.
- **map.size** – возвращает текущее количество элементов.

💥 map[key] это не совсем правильный способ использования **`Map`** \
Поэтому нам следует использовать методы map: set, get и так далее.\
**Map может использовать объекты в качестве ключей.**


💥 Как объект **`Map`** сравнивает ключи \
Чтобы сравнивать ключи, объект **Map** использует алгоритм **SameValueZero**. Это почти такое же сравнение, что и ===, с той лишь разницей, что **NaN** считается равным **NaN**. Так что **NaN** также может использоваться в качестве ключа.

### Перебор Map
Для перебора коллекции Map есть 3 метода:
- map.keys() – возвращает итерируемый объект по ключам,
- map.values() – возвращает итерируемый объект по значениям,
- map.entries() – возвращает итерируемый объект по парам вида [ключ, значение], этот вариант используется по умолчанию в for..of.

💥 Используется порядок вставки
В отличие от обычных объектов **`Object`**, в **`Map`** перебор происходит в том же порядке, в каком происходило добавление элементов.
Map имеет встроенный метод **`forEach`**, схожий со встроенным методом массивов **`Array`**

### Object.entries: Map из Object
При создании Map мы можем указать массив (или другой итерируемый объект) с парами ключ-значение для инициализации
```js
// массив пар [ключ, значение]
let map = new Map([
  ['1',  'str1'],
  [1,    'num1'],
  [true, 'bool1']
]);

alert( map.get('1') ); // str1
```

Если у нас уже есть обычный объект, и мы хотели бы создать Map из него, то поможет встроенный метод Object.entries(obj), который получает объект и возвращает массив пар ключ-значение для него, как раз в этом формате.
```js
let obj = {
  name: "John",
  age: 30
};

let map = new Map(Object.entries(obj));

alert( map.get('name') ); // John
```

### Object.fromEntries: Object из Map
Мы можем использовать **`Object.fromEntries`**, чтобы получить обычный объект из **`Map`**.
```js
let map = new Map();
map.set('banana', 1);
map.set('orange', 2);
map.set('meat', 4);

let obj = Object.fromEntries(map.entries()); // создаём обычный объект (*)

alert(obj.orange); // готово! obj = { banana: 1, orange: 2, meat: 4 }
```

## Set
Объект Set – это особый вид коллекции: «множество» значений (без ключей), где каждое значение может появляться только один раз.
Его основные методы это:
- **`new Set(iterable)`** – создаёт **`Set`**, и если в качестве аргумента был предоставлен итерируемый объект (обычно это массив), то копирует его значения в новый **`Set`**.
- **`set.add(value)`** – добавляет значение (если оно уже есть, то ничего не делает), возвращает тот же объект set.
- **`set.delete(value)`** – удаляет значение, возвращает **`true`**, если **`value`** было в множестве на момент вызова, иначе **`false`**.
- **`set.has(value)`** – возвращает **`true`**, если значение присутствует в множестве, иначе **`false`**.
- **`set.clear()`** – удаляет все имеющиеся значения.
- **`set.size`** – возвращает количество элементов в множестве.

### Перебор объекта Set
Мы можем перебрать содержимое объекта set как с помощью метода for..of, так и используя forEach:
**`Set`** имеет те же встроенные методы, что и **`Map`**:
- **`set.values()`** – возвращает перебираемый объект для значений,
- **`set.keys()`** – то же самое, что и **`set.values()`**, присутствует для обратной совместимости с **`Map`**,
- **`set.entries()`** – возвращает перебираемый объект для пар вида [значение, значение], присутствует для обратной совместимости с **`Map`**.

🚀 **Источник: [https://learn.javascript.ru/map-set](https://learn.javascript.ru/map-set)**