✨ Set
- set 객체는 중복되지 않는 유일한 값들의 집합
- 배열과 유사하지만
1) 동일한 값 중복 X
2) 요소 순서에 의미 없음.
3) 인덱스 접근 불가
- 수학적 집합을 구현하기 위한 자료구조
- 교집합, 차집합, 여집합, 등을 구현할 수 있다.
1. Set 생성
- Set 생성자 함수로 생성한다.
const set = new Set();
- Set 생성자 함수는 이터러블을 인수로 전달받아 Set 객체를 생성한다.
- 중복된 값은 요소로 저장되지 않는다.
- 배열에서 중복된 요소를 제거할 수 있다.
const newArr = arr => [new Set(arr)];
console.log(newArr([2, 1, 2, 3, 4, 3, 4])); // [2, 1, 3, 4]
2. 요소 개수 확인
- size 프로퍼티 사용한다.
- size 프로퍼티는 setter 함수 없이 getter만 존재하는 접근자 프로퍼티 -> 숫자를 할당하여 Set 객체의 요소 개수를 변경할 수 없다.
const { a } = new Set([1, 3, 2, 3]);
console.log(a); // 3
const set = new Set([1, 2, 3]);
console.log(Object.getOwnPropertyDescriptor(Set.prototype, 'size'));
set.size = 10; // 무시된다.
console.log(set.size); // 3
3. 요소 추가
- Set.prototype.add 사용한다.
const set = new Set();
console.log(set); // Set(0) {}
set.add(1);
console.log(set); // Set(1) {1}
- add 메서드 호출한 후에 add 메서드를 연속적으로 호출할 수 있다.
const set = new Set();
set.add(1).add(2);
console.log(set); // Set(2) {1, 2}
- 중복된 요소 추가는 허용되지 않는다.
const set = new Set();
set.add(1).add(2).add(2);
console.log(set); // Set(2) {1, 2}
- 일치 비교 연산자 === 사용하면 NaN과 NaN을 다르다고 평가하지만, Set 객체는 같다고 평가하여 중복 추가 허용하지 않는다.
- +0, -0도 마찬가지.
- Set 객체는 객체나 배열 같이 자바스크립트의 모든 값을 요소로 저장할 수 있다.
4. 요소 존재 여부 확인
- Set.prototype.has 메서드 사용한다.
- 특정 요소의 존재 여부를 나타내는 불리언 값을 반환한다.
const set = new Set([1, 2, 3]);
console.log(set.has(2)); // true
console.log(set.has(4)); // false
5. 요소 삭제
- Set.prototype.delete 메서드 사용한다.
- 삭제 성공 여부를 나타내는 불리언 값을 반환한다.
- 인덱스가 아닌 삭제하려는 요소 값을 인수로 전달해야한다. -> 배열과 같이 인덱스를 갖지 않는다.
- 존재하지 않는 객체의 요소를 삭제하려 하면 에러 없이 무시된다.
- Set.prototype.add 메서드와 달리 연속적으로 호출할 수 없다.
const set = new Set([1, 2, 3]);
set.delete(2);
console.log(set); // Set(2) {1, 3}
5-1. 요소 일괄 삭제
- Set.prototype.clear 메서드 사용한다.
- 언제나 undefined 반환한다.
const set = new Set([1, 2, 3]);
set.clear();
console.log(set); // Set(0) {}
6. 요소 순회
- Set.prototype.forEach 메서드 사용한다.
- Array.prototype.forEach 메서드와 유사하게 콜백 함수와 forEach 메서드의 콜백 함수 내부에서 this로 사용될 객체를 인수로 전달한다.
1) 첫번째 인수: 현재 순회 중인 요소 값
2) 두번째 인수: 현재 순회 중인 요소 값
3) 세번째 인수: 현재 순회중인 Set 객체 자체
- 배열과 달리 Set 객체는 순서에 의미가 없어 인덱스를 갖지 않는다.
const set = new Set([1, 2, 3]);
set.forEach((v, v2, set) => console.log(v, v2, set));
/*
1 1 Set(3) {1, 2, 3}
2 2 Set(3) {1, 2, 3}
3 3 Set(3) {1, 2, 3}
*/
모든 예제와 개념들은 '모던 자바스크립트 deep dive - 이웅모 저' 책에서 참고했습니다.
참고자료: 모던자바스크립트 deep dive - 이웅모 저, pp. 643 ~ 659