자바스크립트

Section 10. 자바스크립트 Set

포칼이 2023. 4. 6. 18:02

Set은 표준 내장 객체 중 하나로서 중복되지 않는 값들의 집합을 말한다.

배열과의 차이는 다음과 같다

  • 동일한 값을 여러 번 포함할 수 없다.
  • 값들의 순서가 무의미하다.

I. 기본 사용법

// Set 생성
const set1 = new Set();

// add 메서드 - 요소 추가
set1.add(1);
set1.add('A');
set1.add(true);

console.log(set1); //{1, 'A', true}

이미 포함된 요소는 추가하지 않는다.

set1.add(1);
set1.add(true);

console.log(set1); //{1, 'A', true}

배열을 인자로 넣으면 생성 + 초기화를 한다. 그리고 중복된 요소가 제거가 된다.

const set2 = new Set([1, 1, 1, 'A', true]);

console.log(set2); //{1, 'A', true}

 

has - 요소 포함여부 확인 메서드

// has 메서드 - 요소 포함여부 확인
console.log(
  set2.has(1),
  set2.has('A'),
  set2.has(4)
); //true true false

 

delete - 요소 제거 및 성공 여부를 반환하는 메서드

console.log(
  set2.delete('A'), //true
  set2.delete(true), //true
  set2.delete(100) //false
);

console.log(set2); //{1}

 

add 메서드는 결과 셋을 반환한다.

const set3 = set2.add(2);

console.log(set3); //{1, 2}

set2
.add(3)
.add(4)
.add(5)

// 참조형이므로 둘이 같은 Set을 가리킴
console.log(set2, set3); //{1, 2, 3, 4, 5} {1, 2, 3, 4, 5}

 

메서드 체이닝이 가능하고 참조형이므로 같은 Set을 가리킨다. 

size 프로퍼티 - 요소의 개수를 반환한다.

// size 프로퍼티 - 요소의 개수
console.log(
  set2.size
); //5

 

keys, values, entries - 값 / 값 / [값, 값]을 반환하는 메서드. key를 value와 같이 취급한다.

// keys, values, entries 메서드 - 값 / 값 / [값, 값] 반환
// key를 value와 같이 취급
console.log(
  set2.keys(), //SetIterator {1, 2, 3, 4, 5} 
  set2.values(), //SetIterator {1, 2, 3, 4, 5} 
  set2.entries() //SetIterator {1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5}
);

 

clear - 모든 요소들을 삭제하는 메서드

set2.clear();

console.log(set2, set3);

모든 요소들이 삭제가 됐다.

 

참조형 데이터의 경우

const objSet1 = new Set()
.add({ x: 1, y: 2 })
.add({ x: 1, y: 2 })
.add([1, 2, 3])
.add([1, 2, 3]);

// 각기 다른 것으로 인식 (참조하는 주소가 다르므로)
console.log(objSet1);

Set은 add했을때 중복된 것은 추가가 되지 않는다. 하지만 출력문을 보니 값은 같아도 모두 add가 되어 출력된 것을 볼 수 있다. 즉, 값만 같을 뿐 서로 참조하는 주소가 다 다른 것 이라고 이해하면 된다.

const obj = { x: 1, y: 2 };
const arr = [1, 2, 3];

const objSet2 = new Set()
.add(obj)
.add(obj)
.add(arr)
.add(arr);

// 같은 것들로 인식
console.log(objSet2)

 

중복된 것들은 add 되지 않았다.

 

II. 이터러블러서의 Set

배열이랑 문자열에서 쓰는 것과 동일하다. 

 

먼저 배열과 set을 생성했다. 

const arr = ['A', 'B', 'C', 'D', 'E'];
const set = new Set(arr);

 

1. for ... of 문

for (item of set) {
  console.log(item);
}
//A
//B
//C
//D
//E

2. 스프레드 문법

const newArr = [...set];

console.log(newArr); //['A', 'B', 'C', 'D', 'E']

또한 set은 중복을 제거하기 때문에

// 활용 - 중복을 제거한 배열 반환
const arr1 = [1, 1, 1, 2, 2, 3, 4, 5];

const arr2 = [...new Set(arr1)];

console.log(arr2); //[1, 2, 3, 4, 5]

이런식으로도 활용이 가능하다. 

 

3. 디스트럭쳐링

const [x, y] = set;
console.log(x); //A
console.log(y); //B
const [a, b, ...rest] = set;

console.log(a); //A
console.log(b); //B
console.log(rest); //['C', 'D', 'E']