Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
Класс 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 }
Помощь сайту
ЮMoney (Yandex-деньги): 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов