Встроенные структуры данных JavaScript получили серьезное обновление с введением Map и Set в ECMAScript 2015. В этой статье мы рассмотрим основы использования этих мощных структур данных, включая их преимущества и практическое применение.

Введение :

Если вы ежедневно используете JavaScript, вам необходимо иметь четкое представление о типах данных языка и нативных методах, введенных для представления этих типов данных в различных структурах данных, каждый из которых имеет свои собственные варианты использования и удобное место для посадки.

Сегодня мы выделим Map и Set, две менее известные структуры данных, которые могут быть чрезвычайно полезны в определенных ситуациях, мы рассмотрим, что такое Sets и Maps, и чем они отличаются из других структур данных и некоторых распространенных случаев использования, где они могут быть особенно полезны, поэтому давайте начнем с Map .

Карта :

Карты – это структура данных, позволяющая хранить пары "ключ-значение", где ключи и значения могут относиться к любому типу данных, включая объекты. Это отличается от обычных объектов, которые позволяют использовать в качестве ключей только строки или символы.

Сначала давайте начнем с создания новой карты:

const myMap = new Map(); // creates a new instance of the Map constructor function

Карта предоставляет множество методов и свойств для взаимодействия, давайте узнаем, как мы можем добавлять и извлекать данные из карты:

let map = new Map(); // create a new Map 

map.set('1', 'string1');   // add '1' as a string key and 'str1' as a string value
map.set(1, 'num1');     // add 1 as numeric key
map.set(true, 'boolean1'); // a boolean key

// remember the regular Object? it would convert keys to string
// Map keeps the type, so these two are different:

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

alert( map.size ); // 3

Мы также можем использовать объекты в качестве ключа в Map:

let person = { name: "Nadjem eddine" };

// for every user, let's store his friends
let friendsCount = new Map();

// person is the key for the map
friendsCount.set(person, 123);

console.log( friendsCount.get(john) ); // 123

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

Итерация по Map очень проста, и у нас есть 3 метода для этого:

1- map.keys() возвращает новый объект итератора, содержащий ключи.
2- map.values()возвращает новый объект итератора, содержащий values.
3- map.entries() возвращает новый итератор для записей [key, value]

Кроме того, Map имеет встроенный метод forEach, похожий на Array:

let personsMap = new Map([
  ['nadjem', 28],
  ['ahmed', 19],
  ['mohammed', 30]
]);

// 1 -  iterate over keys (presons)
for (let person of personsMap.keys()) {
  console.log(vegetable); // nadjem, ahmed, mohammed
}

// 2 -  iterate over values (ages)
for (let age of personsMap.values()) {
  console.log(age); // 28, 19, 30
}

// 3 -  iterate over [key, value] entries
for (let entry of personsMap) { // the same as of personsMap.entries()
  console.log(entry); // nadjem,28 (and so on)
}

// 4 - built in for each method returns (key, value) pair
personsMap.forEach( (value, key, map) => {
  console.log(`${key} is age: ${value}`); // nadjem is age: 28 ...
});

До сих пор мы исследовали ключевые методы и свойства Map, а теперь обратим внимание на другую важную встроенную структуру данных Set.

Набор :

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

Set можно создать с помощью ключевого слова new и конструктора Set(). Мы также можем инициализировать Set итерируемым объектом (например, массивом), передав итерируемый объект в качестве аргумента конструктору Set().

Вот пример создания и использования Set:

// Create a new Set
const mySet = new Set();

// Add elements to the Set
mySet.add(1);
mySet.add('two');
mySet.add({ name: 'Nadjem', age: 28});

// Check the size of the Set
console.log(mySet.size); // Output: 3

// Check if an element exists in the Set
console.log(mySet.has(1)); // Output: true
console.log(mySet.has('two')); // Output: true
console.log(mySet.has({ name: 'Nadjem', age: 28 })); // Output: false (this is a different object reference)

// Remove an element from the Set
mySet.delete('two');

// Iterate over the elements in the Set
for (const element of mySet) {
  console.log(element);
}
// Output: 1
//         { name: 'John', age: 30 }

Основная особенность Set заключается в том, что повторные вызовы set.add(value) с одним и тем же значением ничего не делают, поэтому каждое значение появляется только один раз.

Мы можем перебрать Set, используя for..of или forEach:

let set = new Set(["oranges", "apples", "bananas"]);

for (let value of set) alert(value);

// the same with forEach:
set.forEach((value, valueAgain, set) => {
  alert(value);
});

Заключение :

Таким образом, Map и Set — две полезные структуры данных в JavaScript. Карты используются для сопоставления ключей со значениями, а наборы используются для хранения уникальных значений. Карты позволяют использовать любой тип данных в качестве ключа, а наборы позволяют использовать только один экземпляр каждого значения. Оба предоставляют встроенные методы для добавления, обновления и удаления элементов, а также для проверки существования элемента. Понимание их различий и вариантов использования может повысить эффективность и читабельность вашего кода.