[JS] Set

codeCYJ·2022년 7월 18일
0

javaScript

목록 보기
32/35

Set 이란?

Set 객체는 중복되지 않는 유일한 값들의 집합니다.
배열과 유사하지만

  • 동일한 값을 중복하여 포함할 수 없다.
  • 요소 순서에 의미가 없다.
  • 인덱스로 요소에 접근할 수 없다.
  • 수학적 집합을 구현하기 위한 자료 구조이다.
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'}

Set.size

요소 개수 확인 프로퍼티(getter함수만 존재하는 접근자 프로퍼티이다.)

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

const set = new Set([1,2,3]);
set.size = 10;  // 효과없음.
console.log(set.size); // 3

Set.add

Set 객체에 요소를 추가한다.

const set = new Set();
console.log(set); // Set(0) {};
set.add(1);
console.log(set);  // Set(1) {1}

새로운 요소가 추가된 Set객체를 반환하며 연속적 호출이가능하다.

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}

set객체에서는 NaN과 NaN, +0과 -0을 같다고 평가한다. (중복추가X)

const set = newSet();
console.log(NaN === NaN); // false;
console.log(0===-0);  // true;

set.add(NaN).add(NaN);
console.log(set);  // Set(1) {NaN}

set.add(0).add(-0);
console.log(set); // Set(2) {NaN, 0}

set객체는 배열과 객체와 같이 모든 값을 요소로 저장할 수 있다.

const set = new Set();
set
.add(1)
.add('a');
.add(true);
.add(undefined);
.add(null);
.add([]);
.add({});
.add(()=>{});

console.log(set); // Set(8) {1,'a',true,undefined, null, [], {}, ()=>{}}

Set.has

Set객체에 특정 요소가 존재하는지 확인할 수 있다. 불리언값을 반환한다.

const set = new Set([1,2,3]);
console.log(set.has(2)); // true
console.log(set.has(4)); // false

Set.delete

요소 삭제를 하고, 삭제성공여부를 나타내는 불리언 값을 반환한다.
인덱스가 아니라 삭제하려는 요소값을 인수로 전달해야 한다.

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

존재하지 않는 객체를 삭제하면 무시된다. (에러 X)

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

불리언 값을 반환하므로 add와 같이 연속적 호출이 불가능하다.

const set = new Set([1,2,3]);
set.delete(0).delete(1);  //TypeError: set.delete(...).delete is not a function

Set.clear

Set객체의 모든 요소를 일괄 삭제하고, undefined를 반환한다.

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

Set.forEach

Set객체의 요소를 순회한다.
Array.forEach와 유사하게 콜백함수와 콜백함수 내부에서 this로 사용될 객체를 인수로 전달한다.

  • 첫번째 인수 : 현재 순회중인 요소값
  • 두번째 인수 : 현재 순회중인 요소값
  • 세번째 인수 : 현재 순회중인 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}
*/

Set객체는 이터러블이다. 따라서 for ...of문으로 순회할수 있고, 스프레드문법과 배열 디스트럭처링의 대상이 될 수도있다.

const set = new Set([1,2,3]);
for(const value of set){
	console.log(value);  // 1, 2, 3
}

console.log([...set]); // [1,2,3]
const [a,...rest] = set;
console.log(a,rest) =  // 1,[2,3]

Set객체의 교집합

집합 A와 B의 공통요소로 구성된다.

Set.prototype.intersection = function (set){
  cont result = new Set();
  
  for (const value of set) {
    // 2개의 set의 요소가 공통되는 요소이면 교집합의 대상.
    if(thishas(value)) result.add(value);
  }
  return result;
};

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

console.log(setA.intersection(setB)); // Set(2) {2,4}
console.log(setB.intersection(setA)); // Set(2) {2,4}


or 


Set.prototype.intersection = function (set) {
	return new Set([...this].filter(v=>set.has(v)));
};
const setA = new Set([1,2,3,4]);
const setB = new Set([2,4]);

console.log(setA.intersection(setB)); // Set(2) {2,4}
console.log(setB.intersection(setA)); // Set(2) {2,4}

Set객체의 합집합

집합 A와 집합B의 중복없는 무든 요소로 구성된다.

Set.prototype.union = function(set){
  const result = new Set(this);
  for (const value of set) {
    result.add(value)
  }
  return result;
};

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

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

or 

Set.prototype.union = function (set) {
  return new Set([...this, ...set]);
};


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

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

Set객체의 차집합

차집합 A-B는 집합 A는 존재하지만 집합 B에는 존재하지 않는 요소로 구성된다.

Set.prototype.difference = function (set) {
  const result = new Set(this);
  for (const value of set){
    result.delete(value);
  }
  return result;
};

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

console.log(setA.difference(setB)); // Set(2) {1,3}
console.log(setB.difference(setA)); // Set(0) {}



or

Set.prototype.difference = function (set) {
  return new Set([...this].filter(v=>!set.has(v)));
};

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

console.log(setA.difference(setB)); // Set(2) {1,3}
console.log(setB.difference(setA)); // Set(0) {}

Set객체의 부분집합과 상위집합

집합 A가 집합 B에 포함되는경우 집합 A는 집합 B의 부분집합이며,
집합 B는 집합A의 상위집합이다.

// this가 subset의 상위집합인지 확인한다
Set.prototype.isSuperset = function (subset){
  for(const value of subset){
    if(!this.has(value)) return false;
  }
  return true;
};

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

console.log(setA.difference(setB)); // true
console.log(setB.difference(setA)); // false



or 



Set.prototype.isSuperset = function (subset){
  const supersetArr = [...this];
  return [...subset].every(v=>v.supersetArr.includes(v));
};

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

console.log(setA.difference(setB)); // true
console.log(setB.difference(setA)); // false
profile
안녕하세요

0개의 댓글