Мн

Множини у JavaScript

2 вправи

Про концепцію Множини

У JavaScript множина - це схожа на масив структура даних, яка може містити лише унікальні примітиви та/або посилання на обʼєкти.

Множини потрібно створювати за допомогою конструктора Set; їх можна ініціалізувати значеннями, передавши масив конструктору.

const emptySet = new Set();
const setWithInitialValues = new Set(['hello', 'world']);

Додавання і видалення елементів

Значення не можна додати до множини, якщо воно суворо дорівнює будь-якому з її елементів.

const set = new Set();
set.add(10);
set.add(10); // 10 is strictly equal to 10, so it can't be added again
set.size;
//=> 1;

set.has(10);
//=> true
set.delete(10);
//=> true; 10 was removed
set.delete(10);
//=> false; 10 is not in the set, so nothing happened

const obj = { color: 'magenta' };
const eerilySimilarObj = { color: 'magenta' };

set.add(obj);
set.add(eerilySimilarObj); // obj and eerilySimilarObj reference different objects, so they can both be added
set.size;
//=> 2

set.clear();
set.size;
//=> 0

Перетворення між множинами та масивами

Масиви перетворюються на множини за допомогою конструктора Set. Множини можна перетворити на масиви за допомогою синтаксису розгортання або Array.from().

const arrayWithDuplicates = [7, 3, 3, 9, 3];
const arrayWithoutDuplicates = [...new Set(arrayWithDuplicates)]; // [7, 3, 9]
const anotherArrayWithoutDuplicates = Array.from(new Set(arrayWithDuplicates)); // [7, 3, 9]

Ітерація

Множина - це колекція з ключами, тобто її елементи індексуються ключем, і їх можна перебирати в порядку вставлення. Оскільки ключ і значення елемента множини збігаються, Set.keys() і Set.values() взаємозамінні.

const apples = ['Granny Smith', 'Honey Crisp', 'Royal Gala'];
const appleSet = new Set(apples);

for (let apple of appleSet.keys()) {
  console.log(apple);
}
// 'Granny Smith'
// 'Honey Crisp'
// 'Royal Gala'

for (let apple of appleSet.values()) {
  console.log(apple);
}
// 'Granny Smith'
// 'Honey Crisp'
// 'Royal Gala'

for (let apple of appleSet.entries()) {
  console.log(apple);
}
// ['Granny Smith', 'Granny Smith']
// ['Honey Crisp', 'Honey Crisp']
// ['Royal Gala', 'Royal Gala']

Швидкість пошуку порівняно з масивами

Коли для зберігання колекції даних вибирають множину, а не масив, то зазвичай тому, що збережені значення мають бути унікальними. Однак оскільки унікальності можна досягти й за допомогою масивів, не завжди очевидно, чому це так.

Коротка відповідь: множини оптимізовані для пошуку, а масиви - ні. Методи пошуку в масивах (наприклад, Array.indexOf()) мають час виконання, що зростає лінійно зі зростанням розміру масиву; тобто що більше елементів містить масив, то довше триває пошук. Методи пошуку в множинах, навпаки, мають сталий час виконання, тобто він не залежить від розміру множини.

На практиці ця різниця у швидкості непомітна, якщо колекція не містить величезної кількості даних.

Редагувати через GitHub Посилання відкривається в новому вікні або вкладці

Вивчити концепцію Множини