# Set and Map

ES6 introduced two new data structures: `Map` and `Set`. These provide more robust ways to handle collections of data compared to plain Objects and Arrays.

## 1. Map

A `Map` holds key-value pairs where the keys can be any type (including objects, functions, or primitives).

### Creating and Using a Map

```javascript
const map = new Map();

map.set('name', 'John');
map.set(1, 'number one');
map.set(true, 'bool true');

console.log(map.get('name')); // "John"
console.log(map.get(1));      // "number one"
console.log(map.size);        // 3
```

### Map vs. Object

| Feature | Map | Object |
| :--- | :--- | :--- |
| **Key Types** | Any type (Object, Function, etc.) | Strings or Symbols |
| **Key Order** | Insertion order is preserved | Not guaranteed (though mostly insertion order in modern engines) |
| **Size** | `map.size` property | Manually calculate (e.g., `Object.keys(obj).length`) |
| **Iteration** | Directly iterable | Requires `Object.keys()` or `for...in` |

### Iteration

```javascript
const recipeMap = new Map([
  ['cucumber', 500],
  ['tomatoes', 350],
  ['onion',    50]
]);

// Iterate over keys
for (let vegetable of recipeMap.keys()) {
  console.log(vegetable); // cucumber, tomatoes, onion
}

// Iterate over values
for (let amount of recipeMap.values()) {
  console.log(amount); // 500, 350, 50
}

// Iterate over entries [key, value]
for (let entry of recipeMap) { // same as recipeMap.entries()
  console.log(entry); // ['cucumber', 500] ...
}
```

## 2. Set

A `Set` is a collection of unique values. A value in the Set may only occur once.

### Creating and Using a Set

```javascript
const set = new Set();

set.add(1);
set.add(5);
set.add(5); // Duplicate is ignored
set.add('some text');

console.log(set.has(1)); // true
console.log(set.size);   // 3
```

### Use Case: Removing Duplicates

The most common use case for a Set is to remove duplicates from an array.

```javascript
const numbers = [1, 2, 2, 3, 4, 4, 5];
const uniqueNumbers = [...new Set(numbers)];

console.log(uniqueNumbers); // [1, 2, 3, 4, 5]
```

### Iteration

Sets are iterable, similar to Maps.

```javascript
for (let value of set) {
  console.log(value);
}

// forEach is also supported
set.forEach((value) => {
  console.log(value);
});
```

[[programming/javascript/vanilla/javascript]]
[[programming/javascript/vanilla/weakmap-and-weakset]]
[[programming/javascript/vanilla/iterators-and-iterables]]