Set
Set 객체는 중복되지 않는 유일한 값들의 집합이다. 배열과 유사하지만 다음과 같은 차이가 있다.
- 중복된 값을 포함할 수 없다.
- 요소 순서에 의미가 없다.
- 따라서 인덱스로 요소에 접근할 수 없다.
Set 객체의 생성
let set = new Set();
console.log(set) //Set(0) {}
이터러블을 인수로 전달받아 Set 객체를 생성한다. Set은 중복된 값을 포함할 수 없으므로, 중복된 값은 무시된다.
let set = new Set('Hello');
console.log(set) //Set(4){ 'H', 'e', 'l', 'o' }
요소 개수 확인
let set = new Set('Hello');
console.log(set.size) // 4
let set1 = new Set([1,2,3,4,4])
console.log(set1.size) // 4
요소 추가
let set = new Set();
set.add(1)
console.log(set) //Set(1) { 1 }
set.add(2).add(3).add(3) // 중복된 값은 무시된다.
console.log(set) //Set(3) { 1, 2, 3 }
Set 객체에는 객체나 배열 같은 자바스크립트의 모든 값을 요소로 지정할 수 있다.
요소 존재 여부 확인
let set = new Set([1,2,3]);
console.log(set.has(2)); //true
console.log(set.has(4)); //false
요소 삭제
let set = new Set([1,2,3]);
set.delete(2)
console.log(set) //Set(2) { 1, 3 }
Set 객체는 요소에 순서가 없어 인덱스 요소에 접근할 수 없으므로 삭제하려는 요소 값을 인수로 전달해야 한다. add 메서드와 달리 연속으로 호출할 수 없다.
요소 순회
let 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 }
for(let x of set) {
console.log(x)
}
// 1
// 2
// 3
console.log([...set]) //[ 1, 2, 3 ]
forEach 메서드는 Array.forEach 메서드와 유사하게 동작한다. 첫 번째 인수와 두 번째 인수는 같은 값인데, Array.forEach 메서드와 인터페이스를 통일하기 위함이며 다른 의미는 없다.
Set 객체는 이터러블이기 때문에 for... of 문으로 순회할 수 있으며, 스프레드 문법과 배열 디스트럭처링의 대상이 된다.
Set 객체는 요소의 순서에 의미를 갖지는 않지만 Set 객체를 순회하는 요소가 추가된 순서를 따르는데, 이는 다른 이터러블의 순회와 호환성을 유지하기 위함이다.
Map
Map 객체는 키와 값의 쌍으로 이루어진 컬렉션이다. Map 객체는 객체와 유사하지만 차이가 있다.
- 객체를 포함한 모든 값을 키로 사용할 수 있다.
- 객체는 이터러블이 아니지만, Map은 이터러블이다.
Map 객체의 생성
let map = new Map();
console.log(map) //Map(0) {}
Map 생성자 함수는 이터러블을 인수로 전달받아 Map 객체를 생성한다. 이때 인수로 전달되는 이터러블은 키와 값의 쌍으로 이루어진 요소로 구성되어야 한다. Map 생성자 함수의 인수로 전달한 이터러블에 중복된 키를 갖는 요소가 존재하면 값이 덮어써진다. 따라서 Map 객체에는 중복된 키를 갖는 요소가 존재할 수 없다.
let map = new Map([['key','value'], ['key1','value1']]);
console.log(map) //Map(2) { 'key' => 'value', 'key1' => 'value1' }
let map = new Map([['key1','value'], ['key1','value1']]);
console.log(map) // Map(1) { 'key1' => 'value1' }
요소 개수 확인
let map = new Map([['key','value'], ['key1','value1']]);
console.log(map.size) // 2
Set 객체와 마찬가지로 size 프로퍼티를 사용한다.
요소 추가
let map = new Map([['key','value'], ['key1','value1']]);
map.set('key2','value2')
console.log(map) //Map(3) { 'key' => 'value', 'key1' => 'value1', 'key2' => 'value2' }
map.set('key2','value2').set('key3','value3')
console.log(map)
// Map(4) {
// 'key' => 'value',
// 'key1' => 'value1',
// 'key2' => 'value2',
// 'key3' => 'value3'
// }
set 메서드를 사용하며 중복된 키를 갖는 요소를 추가하면 값이 덮어써진다.
요소 취득
let map = new Map([['key','value'], ['key1','value1']]);
map.set('key2','value2').set('key3','value3')
console.log(map.get('key2')) //value2
let map1 = new Map();
let poy = { fullName : 'poylib'}
map.set(poy, 'developer')
console.log(map.get(poy)) //developer
get 메서드를 사용한다. get 메서드의 인수로 키를 전달하면 Map 객체에서 인수로 전달한 키를 갖는 값을 반환한다. 인수로 전달한 키를 갖는 요소가 존재하지 않으면 undefined를 반환한다.
요소 존재 여부 확인
let map = new Map([['key','value'], ['key1','value1']]);
map.set('key2','value2').set('key3','value3')
console.log(map.has('key')) // true
console.log(map.has('key7')) // false
요소 삭제
let map = new Map([['key','value'], ['key1','value1']]);
map.delete('key1');
console.log(map) //Map(1) { 'key' => 'value' }
Set 객체의 delete 메서드와 마찬가지로 연속적으로 호출할 수 없다.
요소 순회
let map = new Map([['key','value'], ['key1','value1']]);
map.forEach((v,k,map) => console.log(v,k,map));
// value key Map(2) { 'key' => 'value', 'key1' => 'value1' }
// value1 key1 Map(2) { 'key' => 'value', 'key1' => 'value1' }
for(let x of map) {
console.log(x)
}
// [ 'key', 'value' ]
// [ 'key1', 'value1' ]
console.log(...map) //[ 'key', 'value' ] [ 'key1', 'value1' ]
forEach 메서드를 사용해 순회할 수 있다. Array.forEach 메서드와 유사하게 동작하며, 요소 값, 요소 키, map 객체 자체를 순서대로 인수를 전달받는다. Map 객체는 이터러블이므로 for... of 문으로 순회할 수 있고 스프레드 문법과 배열 디스트럭처링 할당의 대상이 된다.
출처 : Deep dive
'Programing > Javascript' 카테고리의 다른 글
[JS] var vs. let vs. const (0) | 2022.07.15 |
---|---|
[JS] Array vs. Set (0) | 2022.06.12 |
[JS] 정규 표현식 RegExp (0) | 2022.06.01 |
[JS] 구조 분해 할당 (0) | 2022.05.18 |
<JS> 자바스트립트로 HTML수정 (0) | 2022.04.20 |