Set

Set

Set 객체는 프리미티브 값이든 객체 참조든 어떤 타입이든 고유한 값을 저장할 수 있게 해줍니다. 각 값은 집합에서 한 번만 나타날 수 있으며, 삽입 순서대로 반복됩니다.

출처: Set - JavaScript | MDN

본문

Set 객체는 프리미티브 값이든 객체 참조든 어떤 타입이든 고유한 값을 저장할 수 있게 해줍니다. Set은 값의 컬렉션이며, 집합의 값은 한 번만 나타날 수 있어 유일합니다. 집합의 요소를 삽입 순서대로 반복할 수 있습니다. 삽입 순서는 각 요소가 add() 메서드로 성공적으로 삽입된 순서와 일치합니다(즉, add() 호출 시점에 동일한 요소가 아직 없었을 때).

값 동등성 (Value equality)

값 동등성은 SameValueZero 알고리즘에 기반합니다. (예전에는 0과 -0을 다르게 취급했던 SameValue를 사용했습니다.) 이는 NaNNaN과 같다고 간주되고(NaN !== NaN이어도), 그 외의 모든 값은 === 연산자의 의미에 따라 같다고 간주된다는 뜻입니다. 객체 키의 경우 동등성은 객체 정체성(참조)에 기반합니다.

Set 구성 메서드 (Set composition methods)

Setdifference(), intersection(), symmetricDifference(), union() 같은 구성 메서드와 isDisjointFrom(), isSubsetOf(), isSupersetOf() 같은 관계 메서드를 제공합니다. 이 메서드들은 일반화를 위해 Set 객체뿐 아니라 set-like한 것이면 무엇이든 인자로 받습니다.

메서드 반환 타입 수학적 동등
A.difference(B) Set A∖B
A.intersection(B) Set A∩B
A.symmetricDifference(B) Set (A∖B)∪(B∖A)
A.union(B) Set A∪B
A.isDisjointFrom(B) Boolean A∩B=∅
A.isSubsetOf(B) Boolean A⊆B
A.isSupersetOf(B) Boolean A⊇B

Set-like 객체 (Set-like objects)

모든 set 구성 메서드는 this가 실제 Set 인스턴스여야 하지만, 인자는 set-like하기만 하면 됩니다. set-like 객체는 다음을 제공합니다.

  • 숫자를 담은 size 속성
  • 요소를 받아 불리언을 반환하는 has() 메서드
  • 집합의 요소를 담은 이터레이터를 반환하는 keys() 메서드

예를 들어 Map 객체는 size, has(), keys()를 가지므로 set-like이며, set 메서드에서 키의 집합처럼 동작합니다. set-like 프로토콜은 요소를 만들기 위해 [Symbol.iterator]() 대신 keys() 메서드를 호출합니다. 이는 Map을 유효한 set-like 객체로 만들기 위함입니다. 배열은 has() 메서드나 size 속성이 없고 keys()가 인덱스를 생성하므로 set-like가 아닙니다. WeakSetkeys() 메서드가 없어 set-like가 아닙니다.

Set 같은 브라우저 API (Set-like) — 브라우저의 "setlike objects"는 여러 면에서 Set처럼 동작하는 Web API 인터페이스입니다. Set처럼 요소가 추가된 순서대로 반복할 수 있고 이름과 동작이 같은 속성·메서드를 가지지만, 각 항목에 특정 사전 정의 타입만 허용합니다. 예를 들어 GPUSupportedFeatures는 문자열을 키/값으로 써야 하는 Set-like 객체입니다. 읽기 전용 Set-like 객체는 size 속성과 entries(), forEach(), has(), keys(), values(), [Symbol.iterator]() 메서드를, 쓰기 가능한 것들은 추가로 clear(), delete(), add() 메서드를 가집니다. 예: GPUSupportedFeatures, XRAnchorSet(읽기 전용), CustomStateSet, FontFaceSet, Highlight, ViewTransitionTypeSet(쓰기 가능).

생성자

  • Set() — 새 Set 객체를 만듭니다.

정적 속성

  • Set[Symbol.species] — 파생 객체를 만드는 데 사용되는 생성자 함수.

인스턴스 속성

Set.prototype에 정의되어 모든 인스턴스가 공유하는 속성: constructor, size(값의 개수), [Symbol.toStringTag](초기 값은 "Set").

인스턴스 메서드

  • Set.prototype.add() — 지정된 값을 아직 존재하지 않으면 이 집합에 삽입합니다.
  • Set.prototype.clear()Set 객체의 모든 요소를 제거합니다.
  • Set.prototype.delete() — 지정된 값을 이 집합에 있으면 제거합니다.
  • Set.prototype.difference() — 집합을 받아 이 집합에는 있지만 주어진 집합에는 없는 요소를 담은 새 집합을 반환합니다.
  • Set.prototype.entries() — 삽입 순서로 각 요소의 [value, value] 배열을 담은 새 이터레이터 객체를 반환합니다. Map과 유사하게 각 항목의 키가 값과 같도록 합니다.
  • Set.prototype.forEach() — 삽입 순서로 각 값에 대해 callbackFn을 한 번씩 호출합니다. thisArg가 제공되면 각 콜백 호출의 this 값으로 사용됩니다.
  • Set.prototype.has() — 지정된 값이 이 집합에 존재하는지 여부를 나타내는 불리언을 반환합니다.
  • Set.prototype.intersection() — 집합을 받아 이 집합과 주어진 집합 모두에 있는 요소를 담은 새 집합을 반환합니다.
  • Set.prototype.isDisjointFrom() — 집합을 받아 이 집합이 주어진 집합과 공통 요소가 없는지 나타내는 불리언을 반환합니다.
  • Set.prototype.isSubsetOf() — 집합을 받아 이 집합의 모든 요소가 주어진 집합에 있는지 여부를 나타내는 불리언을 반환합니다.
  • Set.prototype.isSupersetOf() — 집합을 받아 주어진 집합의 모든 요소가 이 집합에 있는지 여부를 나타내는 불리언을 반환합니다.
  • Set.prototype.keys()Set.prototype.values()의 별칭입니다.
  • Set.prototype.symmetricDifference() — 집합을 받아 이 집합이나 주어진 집합 중 하나에는 있지만 둘 다에는 없는 요소를 담은 새 집합을 반환합니다.
  • Set.prototype.union() — 집합을 받아 이 집합과 주어진 집합 중 하나 또는 둘 다에 있는 요소를 담은 새 집합을 반환합니다.
  • Set.prototype.values() — 삽입 순서로 각 요소의 값을 생성하는 새 이터레이터 객체를 반환합니다.
  • Set.prototype[Symbol.iterator]() — 삽입 순서로 각 요소의 값을 생성하는 새 이터레이터 객체를 반환합니다(values()와 동일).

예제

Set 객체 사용Set과 그 메서드를 사용해 값의 유일성을 보장하고 추가·삭제·검사를 수행할 수 있습니다. 집합의 반복은 삽입 순서대로 요소를 방문합니다. 또한 Array.from(new Set([...]))처럼 배열에서 중복을 제거하는 데 흔히 사용됩니다.

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("some text");
const o = { a: 1, b: 2 };
mySet1.add(o);
mySet1.has(5);            // true
mySet1.delete(5);         // true

더 알아보기

  • Map — 키-값 쌍 컬렉션
  • WeakSet — 약한 참조 값을 가진 집합
  • Array — 배열과의 중복 제거 활용