[Deep Dive] 37. Set과 Map

김현주·2022년 5월 30일
0

Deep Dive

목록 보기
8/10
post-thumbnail

1. Set?

  • Set 객체는 중복되지 않는 유일한 값들의 집합이다.

① Set 객체의 생성

  • Set 객체는 Set 생성자 함수로 생성한다.
  • Set 생성자 함수에 인수를 전달하지 않으면 빈 Set객체가 생성된다.
const set = new Set();
console.log(set); // set(0) {}
  • Set 생성자 함수는 이터러블을 인수로 전달받아 Set객체를 생성한다.
  • 이터러블의 중복된 값은 Set 객체에 요소로 저장되지 않는다.
const set1 = new Set([1, 2, 3, 3]);
console.log(set1); // Set(3) {1, 2, 3}

const set2 = new Set("hello");
console.log(set2); // Set(4) {"h", "e", "l", "o"}
  • 중복을 허용하지 않는 Set객체의 특성을 활용하여 배열에서 중복된 요소를 제거할 수 있다.
// 배열의 중복 요소 제거
const uniq = array => array.filter((v, i, self) => self.indexOf(v) === i );
console.log(uniq([2, 1, 2, 3, 4, 3, 4])); // [2, 1, 3, 4]

// Set을 사용한 배열의 중복 요소 제거
const uniq = array => [...new Set(array)];
console.log(uniq([2, 1, 2, 3, 4, 3, 4])); // [2, 1, 3, 4]

② 요소 개수 확인

  • Set 객체의 요소 개수를 확인할 때는 Set.prototype.size 프로퍼티를 사용한다.
const { size } = new Set([1, 2, 3, 3]);
console.log(size); // 3
  • size 프로퍼티는 setter함수 없이 getter함수만 존재하는 접근자 프로퍼티다.
  • size 프로퍼티에 숫자를 할당하여 Set객체의 요소 개수를 변경할 수 없다.
const set = new Set([1, 2, 3]);
console.log(Object.getOwnPropertyDescriptor(Set.prototype."size"));
// {set: undefined, enumerable: false, configurable: true, get: f}

s.size = 10; // 변경되지않고 무시된다.
console.log(set.size); // 3

③ 요소 추가

  • Set 객체에 요소를 추가할 때는 Set.prototype.add 메서드를 사용한다.
const set = new Set();
console.log(set); // Set(0) {}

set.add(1);
console.log(set); // Set(1) {1}
  • add 메서드는 새로운 요소가 추가된 Set객체를 반환한다.
  • add 메서드를 호출한 후에 add 메서드를 연속적으로 호출(method chanining)할 수 있다.
  • Set 객체에 중복된 요소의 추가는 허용되지 않고 에러가 발생하지도 않고 무시된다.
const set = new Set();

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

set.add(3).add(3).add(4);
console.log(set); // Set(4) {1, 2, 3, 4}
  • Set객체는 객체나 배열과 같이 자바스크립트의 모든 값을 요소로 저장할 수 있다.
const set = new Set();

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

console.log(set); // Set(8) {1, "a", true, undefined, null, {}, [], () => {}}

④ 요소 존재 여부 확인

  • 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 객체의 특정 요소를 삭제하려면 Set.prototype.delete 메서드를 사용한다.
  • delete 메서드는 삭제 성공여부를 나타내는 boolean 값을 반환한다.
  • delete 메서드에는 인덱스가 아니라 삭제하려는 요소값을 인수로 전달해야 한다. → Set 객체는 순서에 의미가 없다.
const set = new Set([1, 2, 3]);

// 요소 2 삭제
set.delete(2);
console.log(set); // Set(2) {1, 3}

// 요소 1 삭제
set.delete(1);
console.log(set); // Set(1) {3}

// 만약 존재하지 않는 Set 객체의 요소를 삭제하려 하면 에러 없기 무시된다.
set.delete(2);
console.log(set); // Set(1) {3}
  • Set.prototype.add 메서드와 달리 연속적으로 호출(method chaining)할 수 없다.
const set = new Set([1, 2, 3]);

set.delete(1).delete(2); // TypeError: set.delete(...).delete is not a function

⑥ 요소 일괄 삭제

  • Set.prototype.clear 메서드를 사용한다.
  • clear 메서드는 언제나 undefined를 반환한다.
const set = new Set([1, 2, 3]);

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

2. Map?

  • Map 객체는 key와 value의 쌍으로 이루어진 컬렉션이다.
구분객체Map 객체
key로 사용할 수 있는 값문자열 또는 심벌 값객체를 포함한 모든 값
이터러블(iterable)XO
요소 개수 확인Object.keys(obj).lengthmap.size

① Map 객체의 생성

  • Map 객체는 Map 생성자 함수로 생성한다.
  • Map 생성자 함수에 인수를 전달하지 않으면 빈 Map 객체가 생성된다.
const map = new Map();

console.log(map); // Map(0) {}
  • Map 생성자 함수는 이터러블을 인수로 전달받아 Map 객체를 생성한다.
  • 인수로 전달되는 이터러블은 key와 value의 쌍으로 이루어진 요소로 구성되어야 한다.
const map1 = new Map([["key1", "value1"], ["key2", "value2"]]);
console.log(map1); // {"Key1" => "value1", "key2" => "value2"}
  • Map 생성자 함수는 인수로 전달한 이터러블에 중복된 키를 갖는 요소가 존재하면 값이 덮어써진다. → Map 객체에는 중복된 키를 갖는 요소가 존재할 수 없다.
const map = new Map([["key1", "value1"], ["key1", "value2"]]);
console.log(map); // Map(1) {"key1" => "value2"}

② 요소 개수 확인

  • Map.prototype.size 프로퍼티를 사용한다.
const { size } = new Map([["key1", "value1"], ["key2", "value2"]]);
console.log(size); // 2

const map = new Map([["key1", "value1"], ["key2", "value2"]]);
console.log(Obejct.getOwnPropertyDescriptor(Map.prototype, 'size'));
// {set: undefined, enumerable: false, configurable: true, get: f}

map.size = 10; // size 프로퍼티에 숫자를 할당하여 Map 객체의 요소 개수를 변경할 수 없다.
console.log(map.size); // 2

③ 요소 추가

  • 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 메서드를 연속적으로 호출(method chaining)할 수 있다.
const map = new Map();

map
	.set("key1", "value1")
	.set("key2", "value2");

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

...

profile
✨프론트엔드 개발자가 되기 위한 독학러✨

0개의 댓글