[JS] new Set 객체

2022. 2. 14. 19:23Javascript/개념

1. Set이란?

  • Set 은 중복을 허용하지 않는 값을 모아놓은 컬렉션이다.
  • 자바스크립트 표준 내장 객체 중 하나이다.
  •  set 객체는 자료형에 관계없이, 원시 값과 객체 참조 모두 유일한 값으로 저장할 수 있다.
  •  즉, set 내의 모든 값을 유일한 값을 유지
const arr = [1, 1, 1, 2, 2, 2, 3, 3, 3];

console.log(new Set(arr)); // Set(3) { 1, 2, 3 }

console.log(...[1, 2, 3]);    // 1 2 3
console.log(...new Set(arr)); // 1 2 3
console.log([...new Set(arr)]); //  [ 1, 2, 3 ]

console.log(Array.from(new Set(arr))); //  [ 1, 2, 3 ]

 

2. Set 생성자 함수

  • Set 생성자 함수를 이용해 Set 객체를 생성한다.
  • 인수를 생략하면 빈 Set 객체가 생성된다.
  • 중복된 값은 Set 객체에 요소로 저장되지 않는다.
const set = new Set();
console.log(set); // Set(0) {}

const set1 = new Set([1, 2, 3, 3]);
console.log(set1); // Set(3) {1, 2, 3}

const set2 = new Set('hello');
console.log(set2); // Set(4) {"h", "e", "l", "o"}

 

 

3. Set 객체 메소드

// 값을 추가하고 Set 자신을 반환한다.
set.add(value)

// 값을 제거하고 성공하면 true, 아니면 false를 반환한다.
set.delete(value)

// Set 내에 값이 존재하면 true, 아니면 false를 반환한다.
set.has(value)

// Set을 비운다.
set.clear()

// Set에 몇 개의 값이 있는지 세어준다.
set.size

// Set 객체를 배열로 변환하는 방법은 Array.from(set)을 사용하면 된다.
const arr = new Set([1,2,2,3,4]);
console.log(Array.from(arr));   // [ 1, 2, 3, 4 ]

 

ex )

const set = new Set([1, 2, 3, 3]);

set.add(5);
console.log(set); // Set(4) { 1, 2, 3, 5 }

set.delete(3);
console.log(set); // Set(3) { 1, 2, 5 }

set.clear();
console.log(set); // Set(0) {}

console.log(set.size);  // 0

 

 

4. 중복 값 제거

  • 동일한 값을 허용하지 않는 Set의 특성을 활용해서 중복 값을 제거할 수 있다.
let set = new Set();

let kim = {name: 'Kim'};
let kyeong = {name: 'Kyeong'};
let min = {name: 'Min'};

set.add(kim);
set.add(kyeong);
set.add(min);
set.add(kim);
set.add(min);

console.log(set);
// Set(3) { { name: 'Kim' }, { name: 'Kyeong' }, { name: 'Min' } }

 

 

5. 요소 순회

  • Set 객체는 반복자(iterator)이기 때문에 for...of 문 등을 통해 순회가 가능하다.
const set = new Set([1, 2, 3]);

for (const value of set) {
  console.log(value); // 1 2 3
}

 

 

6. 집합 연산

- 교집합

Set.prototype.intersection = function(set){
  const result = new Set();

  for(const value of set){
    // this는 생성자 함수가 생성한 인스턴스를 가리킨다.
    if (this.has(value)) result.add(value);
  }

  return result;
};

const setA = new Set([1, 2, 3, 4]);
const setB = new Set([2, 4]);

// setA와 setB의 교집합
console.log(setA.intersection(setB)); // Set(2) {2, 4}
// setB와 setA의 교집합
console.log(setB.intersection(setA)); // Set(2) {2, 4}

교집합에서 new Set()  this없을 때

result--- Set(0) {}
Set(2) { 2, 4 }

result--- Set(0) {}
Set(2) { 2, 4 }

교집합에서 new Set()  this있을 때

result--- Set(4) { 1, 2, 3, 4 }
Set(4) { 1, 2, 3, 4 }

result--- Set(2) { 2, 4 }
Set(2) { 2, 4 }

 

 

 

- 합집합

Set.prototype.union = function(set){
  // this(Set 객체)를 복사
  const result = new Set(this);
  console.log('result---', result);

  for (const value of set) {
    // 합집합은 2개의 Set 객체의 모든 요소로 구성된 집합이다. 중복된 요소는 포함되지 않는다.
    result.add(value);
  }

  return result;
};

const setA = new Set([1, 2, 3, 4]);
const setB = new Set([2, 4]);

// setA와 setB의 합집합
console.log(setA.union(setB)); // Set(4) {1, 2, 3, 4}
// setB와 setA의 합집합
console.log(setB.union(setA)); // Set(4) {2, 4, 1, 3}

합집합에서 new Set()  this없을 때

result--- Set(0) {}
Set(2) { 2, 4 }

result--- Set(0) {}
Set(4) { 1, 2, 3, 4 }

합집합에서 new Set()  this있을 때

result--- Set(4) { 1, 2, 3, 4 }
Set(4) { 1, 2, 3, 4 }

result--- Set(2) { 2, 4 }
Set(4) { 2, 4, 1, 3 }

 

- 차집합

  • 차집합 A-B는 집합 A에는 존재하지만 B에는 존재하지 않는 요소로 구성된다.
Set.prototype.difference = function (set) {
  // this(Set 객체)를 복사
  const result = new Set(this);
	// 차집합 A-B는 집합 A에는 존재하지만 B에는 존재하지 않는 요소로 구성된다.
  for (const value of set) {
    result.delete(value);
  }

  return result;
};

const setA = new Set([1, 2, 3, 4]);
const setB = new Set([2, 4]);

// setA에 대한 setB의 차집합
console.log(setA.difference(setB)); // Set(2) {1, 3}
// setB에 대한 setA의 차집합
console.log(setB.difference(setA)); // Set(0) {}

차집합에서 new Set()  this없을 때

result--- Set(0) {}
Set(0) {}

result--- Set(0) {}
Set(0) {}

차집합에서 new Set()  this있을 때

result--- Set(4) { 1, 2, 3, 4 }
Set(2) { 1, 3 }

result--- Set(2) { 2, 4 }
Set(0) {}

 

 

 

 

7. 부분 집합과 상위 집합

  • 집합 A가 집합 B에 포함되는 경우 집합 A는 B의 부분 집합이며 집합 B는 A의 상위 집합이다.
// this가 subset의 상위 집합인지 확인한다.
Set.prototype.isSuperset = function (subset) {
  for (const value of subset) {
    // superset의 모든 요소가 subset의 모든 요소를 포함하는지 확인
    if (!this.has(value)) return false;
  }

  return true;
};

const setA = new Set([1, 2, 3, 4]);
const setB = new Set([2, 4]);

// setA가 setB의 상위 집합인지 확인한다.
console.log(setA.isSuperset(setB)); // true
// setB가 setA의 상위 집합인지 확인한다.
console.log(setB.isSuperset(setA)); // false

 

 

 

'Javascript > 개념' 카테고리의 다른 글

[JS] if-else if | if - if 차이점  (0) 2022.02.28
[JS] JSON.parse / JSON.stringify  (0) 2022.02.18
[JS] 조건문 if switch  (0) 2022.01.25
[JS] 전개 연산자 Spread Operator  (0) 2022.01.25
[JS] Math  (0) 2022.01.24