Класс Set: множество

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

Создание объекта

Создать объект позволяет следующий конструктор класса Set:

<Объект> = new Set([<Объект, поддерживающий итерации>])

Если параметр не указан, то создается пустой объект:

let set1 = new Set();
console.log(set1); // Set {}

В качестве параметра можно указать объект, поддерживающий итерации, например, массив. Обратите внимание: будут добавлены только уникальные элементы:

let arr = [ 1, 2, 3, 1, 2, 3 ];
let set2 = new Set(arr);
console.log(set2); // Set { 1, 2, 3 }

Добавление элементов

Добавить элемент в конец объекта позволяет метод add(<Значение>). Обратите внимание: будут добавлены только уникальные элементы:

let mySet = new Set([1, 2, 3]);
console.log(mySet); // Set { 1, 2, 3 }
mySet.add(4);
mySet.add(2); // Не будет добавлено, т. к. значение не уникально
console.log(mySet); // Set { 1, 2, 3, 4 }

Метод add() возвращает объект Set, поэтому мы можем создавать цепочки из вызовов метода:

let mySet = new Set();
mySet.add(1)
     .add(2)
     .add(3);
console.log(mySet); // Set { 1, 2, 3 }

Проверка наличия элемента

Метод has(<Значение>) возвращает true, если указанное значение существует, и false — в противном случае:

let mySet = new Set([1, 2, 3]);
console.log( mySet.has(3) ); // true
console.log( mySet.has(4) ); // false

Определение числа элементов

Для определения числа элементов, следует воспользоваться свойством size:

let mySet = new Set([1, 2, 3]);
console.log( mySet.size ); // 3

Удаление элементов

Удалить элементы позволяют следующие методы:

  • delete(<Значение>) — удаляет элемент, соответствующий указанному значению. Метод возвращает true, если элемент был удален, и false — в противном случае (например, если элемент с таким значением не существует):
let mySet = new Set([1, 2, 3]);
console.log( mySet.delete(3) ); // true
console.log( mySet.delete(4) ); // false
console.log( mySet );           // Set { 1, 2 }
  • clear() — удаляет все элементы:
let mySet = new Set([1, 2, 3]);
console.log( mySet ); // Set { 1, 2, 3 }
mySet.clear();
console.log( mySet ); // Set {}

Методы, возвращающие итераторы

Следующие методы возвращают специальный объект — итератор:

  • values() — возвращает итератор, содержащий значения в порядке их добавления:
const process = require('process');
let mySet = new Set([2, 3, 1]);
let iterator = mySet.values();
// Перебор всех элементов
for (const value of iterator) {
   process.stdout.write(`${value} `);
} // 2 3 1
console.log();
// Преобразование в массив
let arrValues = [...mySet.values()];
console.log(arrValues); // [ 2, 3, 1 ]

Можно также воспользоваться методом keys(), который является синонимом метода values() (поддерживается в целях совместимости с классом Map):

let mySet = new Set([2, 3, 1]);
console.log([...mySet.keys()]); // [ 2, 3, 1 ]
  • entries() — возвращает итератор, содержащий пары значение/значение (в целях совместимости с классом Map):
let mySet = new Set([2, 3, 1]);
console.log([...mySet.entries()]);
// [ [ 2, 2 ], [ 3, 3 ], [ 1, 1 ] ]

Перебор элементов

Перебрать все элементы позволяет цикл for...of. На каждой итерации доступно текущее значение:

const process = require('process');
let mySet = new Set([1, 2, 3]);
for (const value of mySet) {
   process.stdout.write(`${value} `);
} // 1 2 3

Можно также воспользоваться методом forEach(). Формат метода:

forEach(<Функция>[, <this>])

В первом параметре указывается ссылка на функцию, которая будет вызвана для каждого элемента. Функция принимает три параметра. Через первый и второй  параметры доступно значение текущего элемента, а через третий — ссылка на объект Set. Значение, указанное в параметре <this>, будет доступно через указатель this внутри функции:

const process = require('process');
let mySet = new Set([1, 2, 3]);
mySet.forEach( function(value, key, s) {
   process.stdout.write(`${value} `);
}); // 1 2 3

Преобразование множества в массив

Создать массив на основе значений объекта Set позволяет статический метод from() из класса Array:

let mySet = new Set([1, 2, 3]);
let arr = Array.from(mySet);
console.log(arr);  // [ 1, 2, 3 ]

Можно также воспользоваться следующим способом:

let mySet = new Set([1, 2, 3]);
let arr = [...mySet.values()];
console.log(arr);  // [ 1, 2, 3 ]

Операции с двумя множествами

Давайте рассмотрим основные операции с двумя множествами:

  • объединение множеств:
function unionSet(a, b) {
   let c = new Set(a);
   for (const value of b) {
      c.add(value);
   }
   return c;
}
let set1 = new Set([1, 2, 3]);
let set2 = new Set([3, 4, 5]);
let set3 = unionSet(set1, set2);
console.log(set3);  // Set { 1, 2, 3, 4, 5 }
// Альтернативный вариант
let set4 = new Set([...set1, ...set2]);
console.log(set4);  // Set { 1, 2, 3, 4, 5 }
  • добавление элементов во множество из объектов, поддерживающих итерации:
function updateSet(a, b) {
   for (const value of b) {
      a.add(value);
   }
}
let set1 = new Set([1, 2, 3]);
let set2 = new Set([3, 4, 5]);
updateSet(set1, set2);
console.log(set1);  // Set { 1, 2, 3, 4, 5 }
updateSet(set1, [1, 4, 5, 7]);
console.log(set1);  // Set { 1, 2, 3, 4, 5, 7 }
  • пересечение множеств:
function intersectionSet(a, b) {
   let c = new Set();
   for (const value of b) {
      if (a.has(value)) {
         c.add(value);
      }
   }
   return c;
}
let set1 = new Set([1, 2, 3]);
let set2 = new Set([1, 2, 4]);
let set3 = intersectionSet(set1, set2);
console.log(set3);  // Set { 1, 2 }
// Альтернативный вариант
let set4 = new Set([...set1].filter(v => set2.has(v)));
console.log(set4);  // Set { 1, 2 }
  • разница множеств:
function differenceSet(a, b) {
   let c = new Set(a);
   for (const value of b) {
      c.delete(value);
   }
   return c;
}
let set1 = new Set([1, 2, 3]);
let set2 = new Set([1, 2, 4]);
let set3 = differenceSet(set1, set2);
console.log(set3);  // Set { 3 }
// Альтернативный вариант
let set4 = new Set([...set1].filter(v => !set2.has(v)));
console.log(set4);  // Set { 3 }
  • симметрическая разница множеств:
function symmetricDifferenceSet(a, b) {
   let _union = new Set([...a, ...b]);
   let _intersection = new Set([...a].filter(v => b.has(v)));
   return new Set(
      [..._union].filter(v => !_intersection.has(v))
   );
}
let set1 = new Set([1, 2, 3]);
let set2 = new Set([1, 2, 4]);
let set3 = symmetricDifferenceSet(set1, set2);
console.log(set3);  // Set { 3, 4 }

Учебник по Node.js и JavaScript
Учебник по JavaScript (Node.js) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов