자바스크립트/모던 자바스크립트

모던 자바스크립트, 셋 혹은 세트 (Set)

Jake Seo 2023. 3. 23. 22:37

셋(Set) 이란?

  • 고유한 값의 모음이다.
  • 맵과 동일하게 동등성 비교에 SameValueZero 알고리즘이 적용된다.
  • Iterable 이다.
    • 값을 넣은 순서대로 순회한다.

기본 메서드

  • add(): 값을 추가할 때 사용한다.
  • clear(): 맵의 모든 엔트리를 삭제할 때 사용한다.
  • delete(): 하나의 엔트리를 삭제할 때 사용한다.
  • has(): 해당 키가 있는지 확인할 때 사용한다.
  • get(): 해당 키에 대응하는 value 를 얻을 때 사용한다.
  • keys(): 모든 키를 MapIterator 형태로 얻는다.
  • entries(): 키 밸류를 엔트리 형태로 얻는다.
  • forEach(): forEach 형태로 순회한다.
  • size: 내부에 몇개의 값이 있는지 알려준다.

동등성 비교 확인하기

  • 맵과 동일하게 동등성 비교에 SameValueZero 알고리즘이 적용된다.
const set = new Set();
set.add(+0);
set.add(-0);

console.log(set.size());
  • +0-0 을 동등하게

배열을 통해 Set 생성하기

const set = new Set([1, 2, 3, 1, 2, 3]);
console.log(set.size); // 3
  • 배열을 통해 Set 생성이 가능하다.
    • Map 은 엔트리 배열을 통해 생성이 가능했다.
  • Set 은 중복된 원소를 넣지 않으므로 원소가 3개만 들어갔다.
    • 이러한 특성을 이용해 배열에서 중복된 것을 지우고 싶다면, Set 생성자를 이용하면 된다.

Iterable 확인하기

const set = new Set([1, 2, 3, 1, 2, 3]);
for (const e of set) {
  console.log(e);
}
/*
출력결과: (값을 입력한 순서대로)
1
2
3
*/

서브 클래싱 활용해보기

class MySet extends Set {
  flattenAndAdd(arr) {
    if (Array.isArray(arr)) {
      const flattenArr = arr.flat(Infinity);

      for (const e of flattenArr) {
        this.add(e);
      }

      return true;
    }

    throw new Error("it is not array");
  }
}

const mySet = new MySet();
mySet.flattenAndAdd([1, 2, 3, [4, 5, [6, 7]]]);
console.log(mySet); // MySet(7) {1, 2, 3, 4, 5, …}

셋(Set) 성능은?

  • 맵과 마찬가지로 O(1) 의 접근시간을 요구한다.
  • 평균적으로 아래의 코드보다 빨라야 한다.
if (!array.includes(value)) {
  array.push(value);
}
반응형