
| set객체는 중복되지 않는 유일한 값들의 집합이다.
이러한 Set 객체는 배열과 유사하지만 몇 가지 차이점이 있다.
(배열은 이 반대의 특징을 가진다는 의미겠지?)
이렇게 수학적 집합의 특성과 일치하는 덕분에 Set으로 교집합, 합집합, 차집합, 여집합 등을 구현할 수 있다.
그렇다면 Set객체는 어떻게 생성할까?
| Set 생성자 함수로 객체를 생성한다.
단, Set 생성자 함수에 인수를 전달하지 않을 경우 빈 객체 가 생성된다.
// Set 생성
const set = new Set() // 인수 전달안함
console.log(set) // Set(0) {} 빈 객체 생성
앞서 다뤘던 이터러블 을 인수로 전달받아서 객체를 생성하는데, 중복된 값은 요소로 저장되지 않는다. => Set 객체의 첫 번째 특징이였다!
이러한 특성을 활용하면 기존에 filter 를 통해 제거했던 배열의 중복요소를 Set으로 간단하게 진행할 수 있다.
// 기존의 filter 활용 방법
const arr1 = array => array.filter((v, i, selr) => self.indexOf(v) === i)
console.log(arr([2, 1, 2, 3, 4, 3, 4])) // [2, 1, 3, 4]
// Set 활용 방법
const arr1 = array => [...new Set(array)]
console.log(arr([2, 1, 2, 3, 4, 3, 4])) // [2, 1, 3, 4]
Set.prototype.size 프로퍼티 사용size 프로퍼티는 setter 함수없이 getter 함수만 존재하는 접근자 프로퍼티이기 때문에 요소 개수를 변경은 할 수 없다. (조회만 가능)const {size} = new Set([1, 2, 3, 3])
console.log(size) // 3 -> 중복된 값 제외하고 개수 체크
Set.prototype.add 메서드 사용add 메서드는 호출할 때마다 새로운 요소가 추가된 Set객체를 반환하므로, 연속적인 호출가능이 때, 중복된 요소를 add 메서드로 추가하여도 에러를 발생시키지않고 알아서^^ 무시한다. (알잘딱깔센~)
const set = new Set()
set.add(1).add(2).add(2)
console.log(set) // Set(2) {1, 2}
Set 객체는 객체나 배열과 같은 자바스크립트의 모든 값을 요소로 저장할 수 있다!
Set.prototype.has 메서드 사용has 메서드는 불리언(boolean) 값 반환const set = new Set([1, 2, 3])
console.log(set.has(2)) // true
console.log(set.has(4)) // false
그렇다면 요소를 삭제할 때는 어떤 메서드를 사용하면 될까? (우리가 잘 아는 그 단어!)
Set.prototype.delete 메서드 사용delete 메서드는 삭제 성공여부를 불리언(boolean) 값 으로 반환단, delete 메서드를 사용할 때는 삭제하려는 요소의 인덱스가 아니라 요소값 자체를 전달해야한다.
Set 객체 특성의 3번째였던 내용을 떠올려보자.
Set 객체는 배열과 다르게 인덱스로 요소에 접근할 수 없다. 고 하였다.
특정 요소말고 전체 삭제(일괄 삭제)를 하고 싶다면 Set.prototype.clear 메서드를 사용하면 되며, clear 메서드는 언제나 undefined 를 반환한다.
Set.prototype.forEach 메서드 사용forEach 메서드와 유사)Set 객체는 이터러블 이므로 for...of문 으로도 순회할 수 있으며, 스프레드 문법 및 배열 디스트럭처링의 대상이 될 수도 있다.
intersection 메서드 사용union 메서드 사용difference 메서드 사용isSuperset 메서드 사용| Map 객체는 키와 값의 쌍으로 이루어진 컬렉션이다.
Set이 배열과 유사했다면, Map 객체는 객체와 유사하지만 몇 가지 차이점이 있는데 표로 살펴보자.
| 구분 | 객체 | Map 객체 |
|---|---|---|
| 키로 사용할 수 있는 값 | 문자열, 심벌 값 | 객체를 포함한 모든 값 |
| 이터러블 | X | O |
| 요소 개수 확인방법 | Object.keys(obj).length | map.size |
그렇다면 Map객체는 어떻게 생성할까?
방법은 Set객체와 동일하다.
| Map 생성자 함수로 객체를 생성한다.
단, Map 생성자 함수에 인수를 전달하지 않을 경우 빈 객체 가 생성된다.
// Map 생성
const map = new Map() // 인수 전달안함
console.log(map) // Map(0) {} 빈 객체 생성
Map 객체도 인수로 전달한 이터러블 중 중복된 키를 갖는 요소가 존재하면 값 덮어쓰기를 하므로 중복된 키를 갖는 요소가 존재할 수 없다.
Map.prototype.size 프로퍼티 사용size 프로퍼티는 setter 함수없이 getter 함수만 존재하는 접근자 프로퍼티이기 때문에 요소 개수를 변경은 할 수 없다. (조회만 가능)놀랍게도 Set 객체와 똑같은 내용...!
Map.prototype.set 메서드 사용set 메서드는 호출할 때마다 새로운 요소가 추가된 Map객체를 반환하므로, 연속적인 호출가능이 때, 중복된 요소를 set 메서드로 추가하여도 에러를 발생시키지않고 알아서^^ 덮어쓰기를 한다. (얘도 참 알잘딱깔센)
Map.prototype.get 메서드 사용get 메서드의 인수로 전달한 키를 전달하면 Map 객체에서 전달된 키를 갖는 값을 반환하며, 존재하지 않을 경우에는 undefined 를 반환한다.Map.prototype.has 메서드 사용has 메서드는 불리언(boolean) 값 반환Map.prototype.delete 메서드 사용delete 메서드는 삭제 성공여부를 불리언(boolean) 값 으로 반환특정 요소말고 전체 삭제(일괄 삭제)를 하고 싶다면 Map.prototype.clear 메서드를 사용하면 되며, clear 메서드는 언제나 undefined 를 반환한다.
Map.prototype.forEach 메서드 사용forEach 메서드와 유사)Map 객체는 이터러블 이므로 for...of문 으로도 순회할 수 있으며, 스프레드 문법 및 배열 디스트럭처링의 대상이 될 수도 있다.
Set 은 배열과 닮은듯 다르고, Map 은 객체와 닮은듯 다른 형태의 자료구조인 것으로 정리해보자