관리 메뉴

진취적 삶

37 set 과 map 본문

개발 도서/자바스크립트 deepdive

37 set 과 map

hp0724 2023. 7. 13. 12:00

37.1 set

set 객체는 중복되지 않는 유일한 값들의 집합

구분 배열 set 객체
동일한 값을 중복하여 포함할수 있다 o x
요소 순서에 의미가있다 o x
인덱스로 요소에 접근할수 있다 o x
### 37.1.1 set 객체의 생성 


set 객체는 생성자 함수로 생성한다. 


```javascript
const uniq = (array) => [...new Set(array)];
console.log(uniq([2, 1, 3, 4, 5, 6, 2, 3])); //[2,1,3,4,5,6]
```


### 37.1.2 요소 개수 확인 


```javascript
const uniq = new Set([1, 2, 3]);
console.log(uniq.size); //3
```


### 37.1.3 요소 추가 


add 로 추가 set 객체 반환 


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


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


### 37.1.4 요소 존재 여부 확인 


Set.prototype.has 메서드 사용  존재 여부를 불리언 값으로 반환 


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

console.log(uniq.has(1)); //true
```


### 37.1.5 요소 삭제 


Set.protoype.delete 메서드 사용 삭제 성공 여부를 불리언 값으로 반환 


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

console.log(uniq.has(1)); //true
console.log(uniq.delete(1)); //true 
```


boolean 값을 반환 하므로 add 와 같이 연속적으로 호출할수 없다. 


### 37.1.6 요소 일괄 삭제 


Set.prototype.clear   언제나 undefined를 반환 


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

console.log(uniq.has(1)); //true
console.log(uniq.delete(1)); //set(0)
```


### 37.1.7 요소 순회 


Set.prototype.forEach 사용 


```javascript
const set = new Set([1, 2, 3]);
set.forEach((v1, v2, set) => console.log(v1, v2, set));
/*
1 1 Set(3) { 1, 2, 3 }
2 2 Set(3) { 1, 2, 3 }
3 3 Set(3) { 1, 2, 3 }
*/
```


### 37.1.8 집합 연산 


Set 객체를 통해 교집합 합집합 차집합 등을 구현할수 있다. 


**교집합** 


```javascript
Set.prototype.intersection = function (set) {
  const result = new Set();
  for (const value of set) {
    if (this.has(value)) result.add(value);
  }
  return result;
};

const setA = new Set([1, 2, 3, 4, 5]);
const setB = new Set([2, 4]);
console.log(setA.intersection(setB));
console.log(setB.intersection(setA));
```


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


합집합


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

  return result;
};
//스프레트 
Set.prototype.union = function (set) {
  return new Set([...this, ...set]);
};

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

console.log(setA.union(setB));
```


차집합


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

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

const setA = new Set([1, 2, 3, 4, 5]);
const setB = new Set([1, 2, 3]);
console.log(setA.difference(setB)); //{4,5}
```

37.2 Map

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

구분 객체 map객체
키로 사용할 수 있는값 문자열 또는 Symbol 객체를 포함한 모든 값
이터러블 x o
요소 개수확인 Object.keys.length map.size
### 37.2.1 Map 객체의 생성


map생성자 함수로 생성 


map 생성자 함수는 이터러블을 인수로 전달받아 map 객체를 생성한다. 


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


중복된 키를 갖는 요소가 존재할수 없다. 


```javascript
const map1 = new Map([
  ["key1", "value1"],
  ["key2", "value2"],
]);
console.log(map1);

//Map(2) { 'key1' => 'value1', 'key2' => 'value2' }
```


### 37.2.2 요소 개수확인 


Map.prototype.size 


size 프로퍼티는 getter 함수만 존재하는 접근자 프로퍼티이기에 숫자를 할당하여 요소 개루를 변경할수 없다. 


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






### 37.2.3 요소 추가 


Map.prototype.set 


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


객체는 문자열 또는 심벌값만 키로 사용할수 있다. 


Map객체는 키 타입에 제한이 없다. 


객체를 포함한 모든 값을 키로 사용할수 있다. 


### 37.2.4 요소 취득


Map.prototype.get 


```javascript
const map = new Map();
console.log(map); //Map(0) {}
map.set("key1", "value1");
console.log(map); //Map(1) { 'key1' => 'value1' }
console.log(map.get("key1")); //value1
```


### 37.2.5 요소 존재 여부 확인 


Map.prototype.has 


```javascript
const lee = { name: "Lee" };
const suha = { name: "Suha" };
const map = new Map([
  [lee, "developer"],
  [suha, "designer"],
]);
console.log(map.has(lee)); //true
console.log(map.has("Suha")); //false
```


### 37.2.6 요소 삭제 


Map.prototype.delete 


```javascript
const lee = { name: "Lee" };
const suha = { name: "Suha" };
const map = new Map([
  [lee, "developer"],
  [suha, "designer"],
]);
console.log(map);
/*
Map(2) {
  { name: 'Lee' } => 'developer',
  { name: 'Suha' } => 'designer'
}
*/
map.delete(suha);
console.log(map); //Map(1) { { name: 'Lee' } => 'developer' }
```


### 37.2.7 요소 일괄 삭제 


Map.prototype.clear


clear 메서드는 언제나 undefined 를 반환 


```javascript
const lee = { name: "Lee" };
const suha = { name: "Suha" };
const map = new Map([
  [lee, "developer"],
  [suha, "designer"],
]);
console.log(map);
/*
Map(2) {
  { name: 'Lee' } => 'developer',
  { name: 'Suha' } => 'designer'
}
*/
map.clear();
console.log(map); //Map(0) {}
```


### 37.2.8 요소 순회 


Map 객체는 이터러블이면서 동시에 이터레인션 객체를 반환하는 메서드를 제공한다. 


| Map 메서드               | 설명                                                      |
| --------------------- | ------------------------------------------------------- |
| Map.prototype.keys    | Map 객체에서 요소키를 값으로 갖는 이터러블이면서 동시에 이터레이터인 객체를 반환한다.       |
| Map.prototype.values  | Map 객체에서 요소값을 값으로 갖는 이터러블이면서 동시에 이터레이터인 객체를 반환한다        |
| Map.prototype.entries | Map 객체에서 요소키와 요소값을 값으로 갖는 이터러블이면서 동시에 이터레이터인 객체를 반환한다.  |


```javascript
const su = { name: "su" };
const ha = { name: "ha" };
const map = new Map([
  [su, "developer"],
  [ha, "designer"],
]);

for (const key of map.keys()) {
  console.log(key);
}
/*
{ name: 'su' }
{ name: 'ha' }
*/
for (const value of map.values()) {
  console.log(value);
}
/*developer
designer
*/

for (const entry of map.entries()) {
  console.log(entry);
}

/*[ { name: 'su' }, 'developer' ]
[ { name: 'ha' }, 'designer' ]
*/
```

'개발 도서 > 자바스크립트 deepdive' 카테고리의 다른 글

48 모듈  (0) 2023.07.13
36 디스트럭처링 할당  (0) 2023.07.13
38 브라우저의 렌더링 과정  (0) 2023.07.13
39 DOM  (0) 2023.07.13
40 이벤트  (0) 2023.07.13