const set = new Set(); // 빈 Set객체 생성
Set 생성자 함수는 이터러블을 인수로 전달받아 Set 객체를 생성한다. (중복 제거됨)
const set1 = new Set([1, 2, 3, 3]); // Set(3) {1, 2, 3}
const set2 = new Set('hello']); // Set(3) {"h", "e", "l", "o"}
// Set을 사용해 배열의 중복 요소 제거
const setArr = array => [...new Set(array)];
setArr([2, 1, 2, 3, 4, 3, 4]); // [2, 1, 3, 4];
Set.prototype.size 프로퍼티 사용
const set = new Set([1, 2, 3]);
console.log(set.size); // 3
Set.prototype.add 메서드 사용
const set = new Set();
set.add(1);
set.add(2).add(3).add(3); // 메서드 체이닝(연속적 호출)가능, 중복 값 무시
const set = new Set();
set
.add(NaN)
.add(NaN)
.add(1)
.add('a')
.add(true)
.add(undefined)
.add(null)
.add({})
.add([]);
console.log(set);
// Set(7) {NaN, 1, "a", true, undefined, null, {}, []}
Set.prototype.has 메서드를 사용
const set = new Set([1, 2, 3]);
console.log(set.has(2)); // true
console.log(set.has(4)); // false
Set.prototype.delete 메서드 사용
const set = new Set([1, 2, 3]);
set.delete(2);
set.delete(1);
console.log(set); // Set(2) {3}
요소 일괄 삭제
Set.prototype.clear 메서드 사용
set.clear();
Set.prototype.forEach 메서드 사용
세 개의 인수를 전달받는다.
(첫 번째 인수와 두 번째 인수는 같은 값이다.)
const set = new Set([1, 3, 5]);
set.forEach((v, v2, set) => console.log(v, v2, set));
/*
1 1 Set(3) {1, 3, 5}
3 3 Set(3) {1, 3, 5}
5 5 Set(3) {1, 3, 5}
*/
Set 객체는 이터러블이기 때문에 for ... of 문으로 순회할 수 있고, 스프레드 문법과 배열 디스트럭처링의 대상이 될 수 있다.
const set = new Set([1, 2, 3]);
for (const value of set) {
console.log(value); // 1 2 3 - for...of
}
console.log([...set]); // [1, 2, 3] - 스프레드
const [a, ...rest] = [...set];
console.log(a, rest); // 1, [2, 3] - 디스트럭처링
Set 객체는 수학적 집합을 구현하기 위한 자료구조다.
따라서 Set 객체를 통해 교집합, 합집합, 차집합 등을 구현할 수 있다.
setA.intersection(setB)
setA.union(setB)
setA.difference(setB)
setA.isSuperset(setB)
객체와 차이점
const map = new Map(); // 빈 Map 객체 생성, Map(0) {}
const map1 = new Map([['key1', 'value1'], ['key2', 'value2']]);
// Map(2) {'key1' => 'value1', 'key2' => 'value2'}
const map2 = new Map([['key1', 'value1'], ['key1', 'value2']]);
// Map(1) {"key1" => "value2"}
Map.prototype.size 프로퍼티 사용
const map1 = new Map([['key1', 'value1'], ['key2', 'value2']]);
console.log(map.size); // 2
Map.prototype.set 메서드 사용
const map = new Map();
map.set('key1', 'value1');
map
.set('key2', 'value2')
.set('key3', 'value3') // 메서드 체이닝(연속적 호출) 가능
.set('key3', 'value4'); // 중복된 키를 갖는 요소를 추가하면 값이 덮어써짐
// Map(3) {'key1' => 'value1', 'key2' => 'value2', 'key3' => 'value4'}
Map 객체는 Set과 같이 NaN과 NaN을 같다고 평가하여 중복 추가를 허용하지 않는다.
(같은 키로 사용한 것처럼 덮어 써진다.)
map.set(NaN, 'value1').set(NaN, 'value2'); // Map(1) { NaN => 'value2' }
객체는 문자열 또는 심벌 값만 키로 사용할 수 있지만 Map 객체는 키 타입에 제한이 없다.
객체를 포함한 모든 값을 키로 사용할 수 있다. (객체와의 가장 큰 차이점)
Map.prototype.get 메서드 사용
const map = new Map();
map.set('key1', 'value1');
map.get('key1'); // 'value1'
map.get('nokey'); // 존재하지 않으면 undefined
Map.prototype.has 메서드 사용
has 메서드는 요소의 존재 여부를 나타내는 불리언 값을 반환한다.
const map = new Map();
map.set('key1', 'value1');
map.has('key1'); // true
map.has('nokey'); // false
Map.prototype.delete 메서드 사용
delete 메서드는 삭제 성공 여부를 나타내는 불리언 값을 반환한다.
const map = new Map();
map.set('key1', 'value1');
map.delete('key1');
map.delete('nokey'); // 존재하지 않는 키를 사용하면 무시됨
요소 일괄 삭제
Map.prototype.clear 메서드 사용 (항상 undefined 반환)
map.clear();
Map.prototype.forEach 메서드 사용
세 개의 인수를 전달받는다.
const map = new Map([['key1', 'value1'], ['key2', 'value2']]);
map.forEach((v, k, map) => console.log(v, k, map));
/*
value1 key1 Map(2) {'key1' => 'value1', 'key2' => 'value2'}
value2 key2 Map(2) {'key1' => 'value1', 'key2' => 'value2'}
*/
Map 객체는 이터러블이기 때문에 for ... of 문으로 순회할 수 있고, 스프레드 문법과 배열 디스트럭처링 할당의 대상이 될 수 있다.
const map = new Map([['key1', 'value1'], ['key2', 'value2']]);
for (const entry of map) {
console.log(entry); // ['key1', 'value1'], ['key2', 'value2'] - for...of
}
console.log([...map]);
// [['key1', 'value1'], ['key2', 'value2']] - 스프레드
const [a, b] = map;
console.log(a, b); // ['key1', 'value1'], ['key2', 'value2'] - 디스트럭처링
Map 객체는 이터러블이면서 동시에 이터레이터인 객체를 반환하는 메서드를 제공한다.
const map = new Map([['key1', 'value1'], ['key2', 'value2']]);
for (const key of map.keys()) {
console.log(key); // key1 key2
}
for (const value of map.values()) {
console.log(value); // value1 valye2
}
for (const entry of map.entries()) {
console.log(entry); // ['key1', 'value1'] ['key2', 'value2']
}
ref) 모던 자바스크립트 딥다이브 - 위키북스