Set과 Map

Jayden ·2023년 4월 14일
0

1. Set

Set 객체는 중복되지 않는 유일한 값들의 집합이다. 배열과 유사하지만 다음과 같은 차이가 있다.

  • 동일한 값을 중복하여 포함할 수 없다.
  • 요소 순서에 의미가 없다.
  • 인덱스로 접근이 불가하다.

1) Set 객체 생성

const set = new Set();
console.log(set);

Set 생성자 함수는 이터러블을 인수로 전달받아 Set 객체를 생성한다. 이때 이터러블의 중복된 값은 Set 객체에 요소로 저장되지 않는다.

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

const set2 = new Set('hello');
console.log(set2);

중복을 허용하지 않는 Set 객체의 특성을 활용하여 배열에서 중복된 요소를 제거할 수 있다.

const uniq = array => array.filter((v, i, self) => self.indexOf(v) === i);
console.log(uniq([2,1,2,3,4,3,4]));

const uniq = array => [...new Set(array)];
//Set도 이터러블이므로 스프레드 연산자를 사용할 수 있다.
console.log(uniq([2,1,2,3,4,3,4]));

2) 요소 개수 확인

Set.prototype.size 프로퍼티를 사용한다.

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

3) 요소 추가

Set.prototype.add 메소드를 사용한다.

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

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

const set = new Set();

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

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

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


// +0과 -0을 같다로 평가하여 중복 추가를 허용하지 않는다.
set.add(0).add(-0);
console.log(set);

Set 객체는 객체나 배열과 같이 자바스크립트의 모든 값을 저장할 수 있다.


const set = new Set();

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

console.log(set);

4)요소 존재 여부 확인

Set 객체에 특정 요소가 존재하는지 확인하려면 Set.prototype.has 메소드를 사용한다. has 메소드는 특정한 요소의 존재 여부를 나타내는 불리언 값을 반환한다.

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

console.log(set.has(2)); // true
console.log(set.has(4)); // false

5) 요소 삭제

Set.prototype.delete 메소드를 사용한다. delete 메소드는 삭제 성공 여부를 나타내는 불리언 값을 반환한다.

delete 메소드는 인덱스가 아니라 삭제하려는 요소값을 인수로 전달해야 한다.

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

//요소 2를 삭제한다.
set.delete(2);
console.log(set);

//요소 1을 삭제한다.
set.delete(1);
console.log(set);

만약 존재하지 않는 Set의 객체 요소를 삭제하려 하면 에러없이 무시된다.

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

//존재하지 않는 요소 0을 삭제하면 에러없이 무시된다.
set.delete(0);
console.log(set);
const set = new Set([1,2,3]);
set.delete(1).delete(2);

6) 요소 일괄 삭제

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

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

2. Map

Map 객체는 키와 값의 쌍으로 이루어진 컬렉션이다. Map 객체는 객체와 유사하지만 다음과 같은 차이가 있다.

  • 객체를 포함한 모든 값을 키로 사용할 수 있다.
  • 이터러블이다.
  • map.size로 요소의 개수를 확인할 수 있다.

1) Map 객체의 생성

const map = new Map();
console.log(map); //Map(0){}

Map 생성자 함수는 이터러블을 인수로 전달되는 이터러블은 키와 값의 쌍으로 이루어진 요소로 구성되어야 한다.

const map1 = new Map([['key1','value1'],['key2','value2']]);
console.log(map1); //  Map(2) {"key1"=> "value1","key2"=>"value2"}

const map2 = new Map([1,2]); // TypeError : Iterater value 1 is not an entry object 
//=> key와 value로 이루어진 배열이 아닌 일반배열 사용, 오류 발생

2) 요소 개수 확인

Map 객체의 요소 개수를 확인할 때는 Map.prototype.size 프로퍼티를 사용한다.

const {size} = new Map([['key1','value1'],['key2','value2']]);
console.log(size); //2

3) 요소 추가

Map 객체에 요소를 추가할 때는 Map.prototype.set 메소드를 사용한다.

const map = new Map();
console.log(map); // Map(0){}

map.set('key1', 'value1');
console.log(map); //Map(1) {"key1" => "value1"}

Set 메소드는 새로운 요소가 추가된 Map 객체를 반환한다. 따라서 set 메소드를 호출한 후에 set 메소드를 연속적으로 호출할 수 있다.


const map = new Map();

map.set('key1', 'vaule1').
.set('key2','value2');

console.log(map); //Map(2) {"key1" => "value1", "key2" => "value2"}
const map = new Map();

map.set('key1','value1')
.set('key1','value2');

console.log(map); // Map(1) {"key1"=>"value2"}
const map = new Map();

console.log(NaN === NaN);
console.log(0 === -0);

map.set(NaN, 'value1').set(NaN, 'value2');
console.log(map);

map.set(0,'value1').set(-0, 'value2');
console.log(map); // Map(2) {NaN => 'value2',0 => 'value2'}

4) 요소 취득

Map.prototype.get 메소드를 사용. get 메소드의 인수로 키를 전달하면 Map 객체에서 인수로 전달한 키에 대한 값을 반환한다. 키 값이 존재하지 않을 경우 undefined를 반환한다.



const map = new Map();

const lee = {name : 'Lee'};
const kim = {name : 'Kim'};

map.set(lee, 'developer')
.set(kim, 'designer');

console.log(map.get(lee)); //true
console.log(map.get('key')); //false

5) 요소 존재 여부확인

Map.prototype.has 메소드를 사용한다. 특정 요소의 존재 여부를 나타내는 불리언 값을 반환한다.

const lee = {name : 'Lee'};
const kim = {name : 'Kim'};

const map = new Map([lee, 'developer'],[kim,'designer']);

console.log(map.has(lee)); //true
console.log(map.has(key)); //false
profile
프론트엔드 개발자

0개의 댓글