Movatterモバイル変換


[0]ホーム

URL:


  1. Веб-технологии для разработчиков
  2. JavaScript
  3. Справочник по JavaScript
  4. Стандартные встроенные объекты
  5. Set

This page was translated from English by the community.Learn more and join the MDN Web Docs community.

View in EnglishAlways switch to English

Set

Baseline Widely available *

This feature is well established and works across many devices and browser versions. It’s been available across browsers since ⁨июль 2015 г.⁩.

* Some parts of this feature may have varying levels of support.

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

Описание

Объекты "Set" - это коллекция значений. Значение вSetможет встречаться только один раз; оно уникально в коллекции. Вы можете перебирать элементы набора в порядке вставки. Порядоквставки соответствует порядку, в котором каждый элемент был успешно вставлен в коллекцию методомadd() (то есть, когда был вызванadd(), в наборе ещё не было такого элемента).

Спецификация требует реализации наборов, "которые в среднем обеспечивают время доступа, сублинейное количеству элементов в коллекции". Следовательно, он может быть представлен внутренне в виде хэш-таблицы (с поиском O(1)), дерева поиска (с поиском O(log(N))) или любой другой структуры данных, при условии, что сложность выше, чем O(N).

Сравнение значений

При добавлении нового элемента в Set происходит проверка, добавлялся ли такой элемент ранее. Эта проверка использует специальный алгоритм сравнения значенийSameValueZero. (Раньше использовался алгоритмSameValue, в котором значения0 и-0 считаются разными. Смотрите браузерную поддержку ниже). Это означает, чтоNaN считается равнымNaN (не смотря на то чтоNaN !== NaN), а все другие значения считаются равными в соответствии с семантикой оператора===.

Производительность

Методhas проверяет наличие значения в коллекции, используя алгоритм, который в среднем работает быстрее перебора добавленных ранее элементов. В частности он в среднем быстрее, чем методArray.prototype.includes для массива, у которого столько же элементов, сколько в коллекции.

Конструктор

Set()

Создаёт новый объектSet.

Статические свойства

get Set[@@species]

Функция-конструктор, которая используется для создания производных объектов.

Свойства экземпляра

Set.prototype[@@toStringTag]

Начальное значение@@toStringTag свойства - строка"Set". Это значение используется вObject.prototype.toString().

Set.prototype.size

Возвращает количество значений в объектеSet.

Методы экземпляра

  • Set.prototype.add()
    • : Вставляет новый элемент с указанным значением в объектSet, если вSet ещё нет элемента с таким же значением.
  • Set.prototype.clear()
    • : Удаляет все значения из объектаSet.
  • Set.prototype.delete()
    • : Удаляет элемент, связанный с переданным значением, и возвращает логическое значение, подтверждающее, был ли элемент успешно удалён или нет.Set.prototype.has(value) впоследствии вернетfalse.
  • Set.prototype.has()
    • : Возвращает логическое значение, утверждающее, присутствует ли элемент с заданным значением в объектеSet или нет.
  • Set.prototype[@@iterator]()
    • : Возвращает новый объект итератора, который выдаетзначения для каждого элемента в объектеSet в порядке вставки.
  • Set.prototype.values()
    • : Возвращает новый объект итератора, который выдаетзначения для каждого элемента в объектеSet в порядке вставки.
  • Set.prototype.keys()
  • Set.prototype.entries()
    • : Возвращает новый объект итератора, который содержитмассив[value, value] для каждого элемента в объектеSet в порядке вставки.

    Этот метод похож на соответствующий метод объектаMap, но в случаеSet ключ (key) каждой записи совпадает с её значением (value).

  • Set.prototype.forEach()
    • : ВызываетcallbackFn один раз для каждого значения, присутствующего в объектеSet в порядке вставки. Если указан параметрthisArg, он будет использоваться в качестве значенияthis для каждого вызоваcallbackFn.

Примеры

Использование объекта Set

js
const mySet1 = new Set();mySet1.add(1); // Set(1) { 1 }mySet1.add(5); // Set(2) { 1, 5 }mySet1.add(5); // Set(2) { 1, 5 }mySet1.add("текст"); // Set(3) { 1, 5, 'текст' }const o = { a: 1, b: 2 };mySet1.add(o);mySet1.add({ a: 1, b: 2 }); // o ссылается на другой объект, так что это нормальноmySet1.has(1); // truemySet1.has(3); // false, поскольку 3 не был добавлен в наборmySet1.has(5); // truemySet1.has(Math.sqrt(25)); // truemySet1.has("Текст".toLowerCase()); // truemySet1.has(o); // truemySet1.size; // 5mySet1.delete(5); // удаляет элемент 5 из setmySet1.has(5); // false, 5 был удалёнmySet1.size; // 4, поскольку мы удалили одно значениеmySet1.add(5); // Set(5) { 1, "текст", {...}, {...}, 5 } - ранее удаленный элемент будет добавлен как новый элемент, он не сохранит свое первоначальное положение до удаленияconsole.log(mySet1); // Set(5) { 1, "текст", {…}, {…}, 5 }

Итерация по объекту Set

Итерация наборов проходит по элементам в порядке вставки.

js
for (const item of mySet1) {  console.log(item);}// 1, "текст", { "a": 1, "b": 2 }, { "a": 1, "b": 2 }, 5for (const item of mySet1.keys()) {  console.log(item);}// 1, "текст", { "a": 1, "b": 2 }, { "a": 1, "b": 2 }, 5for (const item of mySet1.values()) {  console.log(item);}// 1, "текст", { "a": 1, "b": 2 }, { "a": 1, "b": 2 }, 5// ключ и значение здесь одинаковыfor (const [key, value] of mySet1.entries()) {  console.log(key);}// 1, "текст", { "a": 1, "b": 2 }, { "a": 1, "b": 2 }, 5// Преобразуем объект Set в объект Array с помощью Array.fromconst myArr = Array.from(mySet1); // [1, "текст", {"a": 1, "b": 2}, {"a": 1, "b": 2}, 5]// следующее также будет работать, если запустить его в HTML-документеmySet1.add(document.body);mySet1.has(document.querySelector("body")); // true// преобразование между Set и Arrayconst mySet2 = new Set([1, 2, 3, 4]);console.log(mySet2.size); // 4console.log([...mySet2]); // [1, 2, 3, 4]// пересечение можно представить следующим образомconst intersection = new Set([...mySet1].filter((x) => mySet2.has(x)));// разность можно представить следующим образомconst difference = new Set([...mySet1].filter((x) => !mySet2.has(x)));// итерироваться можно с помощью forEach()mySet2.forEach((value) => {  console.log(value);});// 1// 2// 3// 4

Реализация базовых операций Set

js
function isSuperset(set, subset) {  for (const elem of subset) {    if (!set.has(elem)) {      return false;    }  }  return true;}function union(setA, setB) {  const _union = new Set(setA);  for (const elem of setB) {    _union.add(elem);  }  return _union;}function intersection(setA, setB) {  const _intersection = new Set();  for (const elem of setB) {    if (setA.has(elem)) {      _intersection.add(elem);    }  }  return _intersection;}function symmetricDifference(setA, setB) {  const _difference = new Set(setA);  for (const elem of setB) {    if (_difference.has(elem)) {      _difference.delete(elem);    } else {      _difference.add(elem);    }  }  return _difference;}function difference(setA, setB) {  const _difference = new Set(setA);  for (const elem of setB) {    _difference.delete(elem);  }  return _difference;}// Примерыconst setA = new Set([1, 2, 3, 4]);const setB = new Set([2, 3]);const setC = new Set([3, 4, 5, 6]);isSuperset(setA, setB); // trueunion(setA, setC); // Set {1, 2, 3, 4, 5, 6}intersection(setA, setC); // Set {3, 4}symmetricDifference(setA, setC); // Set {1, 2, 5, 6}difference(setA, setC); // Set {1, 2}

Связь с объектами массива

js
const myArray = ["value1", "value2", "value3"];// Используйте обычный конструктор Set для преобразования массива в наборconst mySet = new Set(myArray);mySet.has("value1"); // true// Используйте синтаксис spread для преобразования набора в массив.console.log([...mySet]); // Покажет вам точно такой же массив, как и myArray

Удаление повторяющиеся элементов из массива

js
const numbers = [2, 3, 4, 4, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 5, 32, 3, 4, 5];console.log([...new Set(numbers)]); // [2, 3, 4, 5, 6, 7, 32]

Связь со строками

js
// Чувствительность к регистру (коллекция будет содержать "F" и "f")new Set("Firefox"); // Set(7) [ "F", "i", "r", "e", "f", "o", "x" ]// Пропуск дубликатов ("f" встречается два раза в строке, но в коллекции будет только один раз)new Set("firefox"); // Set(6) [ "f", "i", "r", "e", "o", "x" ]

Используйте Set для обеспечения уникальности списка значений

js
const array = Array.from(document.querySelectorAll("[id]")).map((e) => e.id);const set = new Set(array);console.assert(set.size === array.length);

Спецификации

Specification
ECMAScript® 2026 Language Specification
# sec-set-objects

Совместимость с браузерами

Смотрите также

Help improve MDN

Learn how to contribute

This page was last modified on byMDN contributors.


[8]ページ先頭

©2009-2025 Movatter.jp