Set과 Map

ken6666·2024년 4월 23일
0

JS

목록 보기
29/39

Set

Set 객체는 중복되지 않는 유일한 값들의 집합이다. 배열과 유사 하지만 동일한 값을 포함할 수 없고 인덱스가 없다.

Set

Set 객체의 생성

const set = new Set();
console.log(set); // Set(0) {}

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 생성자 함수에 인수를 전달하지 않으면 빈 Set 객체가 생성된다.
  • 이터러블을 인수로 받아 Set 객체를 생성한다. 중복된 값은 저장하지 않는다.

요소 개수 확인

const set = new Set([1, 2, 3]);

console.log(set.size)//3

set.size = 10; // 무시된다.
console.log(set.size); // 3
  • 요소 개수 확인할 떄는 size 프로퍼티를 사용한다.
  • getter 함수만 존재하는 접근자 프로퍼티이기 때문에 숫자를 할당하여 요소 개수를 변경 할 수 없다.

요소 추가

const set = new Set();

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

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

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

set
  .add(1)
  .add('a')
  .add(true)
  .add(undefined)
  .add(null)
  .add({})
  .add([]);

console.log(set); // Set(7) {1, "a", true, undefined, null, {}, []}
  • Set 객체는 객체나 배열과 같이 자바스크립트의 모든 값을 요소로 저장할 수 있다.

요소 존재 여부 확인

const set = new Set([1, 2, 3]);

console.log(set.has(2)); // true
console.log(set.has(4)); // false
  • Set 객체에 특정 요소가 존재한느지 확인하려면 has 메서드를 사용한다. 불리언값을 반환한다.

요소 삭제

const set = new Set([1, 2, 3]);


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

set.delete(0);
console.log(set); // Set(3) {1, 2, 3}

set.delete(1).delete(2); // TypeError: set.delete(...).delete is not a function
  • delete 메서드는 인덱스가 아니라 삭제하려는 요소값을 인수로 전달해야한다
  • 존재하지 않는 값을 지우면 에러 없이 무시된다.
  • delete 메서드는 삭제 성공 여부를 나타내는 불리언 값을 반환하기 때문에 연속적으로 호출 불가능.

요소 일괄 삭제

const set = new Set([1, 2, 3]);

set.clear();
console.log(set); // Set(0) {}
  • 요소 일괄 삭제는 clear 메서드를 사용한다. 언제나 undefined를 반환한다.

요소 순회

const 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}
*/
  • 요소를 순회하려면 forEach 메서드를 사용한다
    • 첫 번째 인수: 현재 순회 중인 요소값
    • 두 번째 인수: 현재 순회 중인 요소값
    • 세 번째 인수: 현재 순회 중인 set 객체 자체
  • 첫 번째와 두 번째가 같은 이유는 Array의 forEach 메서드와 인터페이스를 통일하기 위함이다
  • Set 객체는 이터러블이므로 for...of 로 순회할 수 있다.

Map

Map 객체는 키와 값의 쌍으로 이루어진 컬렉션이다 객체와 유사하지만 객체와 달리 이터러블이다.

Map

Map 객체의 생성

const map = new Map();
console.log(map); // Map(0) {}

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

const map2 = new Map([1, 2]); // TypeError: Iterator value 1 is not an entry object

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

요소 개수 확인

const { size } = new Map([['key1', 'value1'], ['key2', 'value2']]);
console.log(size); // 2
  • size 프로퍼티를 사용하여 요소 개수를 확인한다.
  • Set과 마찬가지로 Map 객체의 요소 개수를 변경할 수 없다.

요소 추가

const map = new Map();

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

console.log(map); // Map(2) {"key1" => "value1", "key2" => "value2"}
  • 요소를 추가할 때는 set 메서드를 사용한다.
  • 새로운 요소가 추가된 Map 객체를 반환하기 떄문에 연속적으로 호출 가능하다.
  • 중복된 요소를 추가하면 에러없이 값이 덮어써진다.
const map = new Map();

const lee = { name: 'Lee' };
const kim = { name: 'Kim' };

map
  .set(lee, 'developer')
  .set(kim, 'designer');

console.log(map);
// Map(2) { {name: "Lee"} => "developer", {name: "Kim"} => "designer" }
  • Map 객체는 키 타입에 제한이 없다. 모든 값을 키로 사용가능하다.

요소 취득

const map = new Map();

const lee = { name: 'Lee' };
const kim = { name: 'Kim' };

map
  .set(lee, 'developer')
  .set(kim, 'designer');

console.log(map.get(lee)); // developer
console.log(map.get('key')); // undefined
  • 특정 요소를 취득하려면 get 메서드를 사용한다
  • 키가 존재하지 않으면 undefined를 반환한다.

요소 존재 여부 확인

const lee = { name: 'Lee' };
const kim = { name: 'Kim' };

const map = new Map([[lee, 'developer'], [kim, 'designer']]);

console.log(map.has(lee)); // true
console.log(map.has('key')); // false
  • 특정 요소가 존재하는지 확인하려면 has 메서드를 사용한다. 불리언 값을 반환한다.

요소 삭제

const lee = { name: 'Lee' };
const kim = { name: 'Kim' };

const map = new Map([[lee, 'developer'], [kim, 'designer']]);

map.delete(kim);
console.log(map); // Map(1) { {name: "Lee"} => "developer" }
  • 삭제는 delete 메서드를 사용한다. 불리언 값을 반환한다.
  • 존재하지 않는 키로 삭제하려면 에러 없이 무시된다.
  • 연속적으로 호출할 수 없다.

요소 일괄 삭제

const lee = { name: 'Lee' };
const kim = { name: 'Kim' };

const map = new Map([[lee, 'developer'], [kim, 'designer']]);

map.clear();
console.log(map); // Map(0) {}
  • 일괄 삭제는 clear 메서드는 사용한다. 언제나 undefined를 반환한다.

요소 순회

const lee = { name: 'Lee' };
const kim = { name: 'Kim' };

const map = new Map([[lee, 'developer'], [kim, 'designer']]);

map.forEach((v, k, map) => console.log(v, k, map));
/*
developer {name: "Lee"} Map(2) {
  {name: "Lee"} => "developer",
  {name: "Kim"} => "designer"
}
designer {name: "Kim"} Map(2) {
  {name: "Lee"} => "developer",
  {name: "Kim"} => "designer"
}
*/
  • 요소를 순회하려면 forEach 메서드를 사용한다.
    • 첫 번째 인수: 현재 순회 중인 요소값
    • 두 번째 인수: 현재 순회 중인 요소키
    • 세 번째 인수: 현재 순회중인 Map 객체 자체
  • Map 객체는 이터러블이며 for...of 로 순회 가능하다.
  • Map 객체는 요소의 순서에 의미를 갖지 않지만 Map 객체를 순회라는 순서는 요소가 추가된 순서를 따른다. 다른 이터러블의 순회와 호환성을 유지하기 위함이다.

0개의 댓글