관리 메뉴

Daehyunii's Dev-blog

37μž₯ Setκ³Ό Map λ³Έλ¬Έ

37.1 Set

  Set κ°μ²΄λŠ” μ€‘λ³΅λ˜μ§€ μ•ŠλŠ” μœ μΌν•œ κ°’λ“€μ˜ 집합이닀. Set κ°μ²΄λŠ” λ°°μ—΄κ³Ό μœ μ‚¬ν•˜μ§€λ§Œ λ‹€μŒκ³Ό 차이가 μžˆλ‹€.

ꡬ뢄 λ°°μ—΄ Set 객체
λ™μΌν•œ 값을 μ€‘λ³΅ν•˜μ—¬ 포함할 수 μžˆλ‹€. o x
μš”μ†Œ μˆœμ„œμ— μ˜λ―Έκ°€ μžˆλ‹€. o x
인덱슀둜 μš”μ†Œμ— μ ‘κ·Όν•  수 μžˆλ‹€. o x

  μ΄λŸ¬ν•œ Set 객체의 νŠΉμ„±μ€ μˆ˜ν•™μ  μ§‘ν•©μ˜ νŠΉμ„±κ³Ό μΌμΉ˜ν•œλ‹€. Set은 μˆ˜ν•™μ  집합을 κ΅¬ν˜„ν•˜κΈ° μœ„ν•œ μžλ£Œκ΅¬μ‘°λ‹€. λ”°λΌμ„œ Set을 톡해 ꡐ집합, 합집합, 차집합, 여집합 등을 κ΅¬ν˜„ν•  수 μžˆλ‹€.

 

37.1.1 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'}

 

37.1.2 μš”μ†Œ 개수 확인

  Set 객체의 μš”μ†Œ 개수λ₯Ό 확인할 λ•ŒλŠ” Set.prototype.size ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•œλ‹€. size ν”„λ‘œνΌν‹°λŠ” setter ν•¨μˆ˜ 없이 getter ν•¨μˆ˜λ§Œ μ‘΄μž¬ν•˜λŠ” μ ‘κ·Όμž ν”„λ‘œνΌν‹°λ‹€. λ”°λΌμ„œ size ν”„λ‘œνΌν‹°μ— 숫자λ₯Ό ν• λ‹Ήν•˜μ—¬ Set 객체의 μš”μ†Œ 개수λ₯Ό λ³€κ²½ν•  μˆ˜λŠ” μ—†λ‹€.

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

 

37.1.3 μš”μ†Œ μΆ”κ°€

  Set 객체에 μš”μ†Œλ₯Ό μΆ”κ°€ν•  λ•ŒλŠ” Set.prototype.add λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€. add λ©”μ„œλ“œλŠ” μƒˆλ‘œμš΄ μš”μ†Œκ°€ μΆ”κ°€λœ Set 객체λ₯Ό λ°˜ν™˜ν•œλ‹€. λ”°λΌμ„œ add λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ 후에 add λ©”μ„œλ“œμ— μ—°μ†μ μœΌλ‘œ ν˜ΈμΆœν•  수 μžˆλ‹€. Set 객체에 μ€‘λ³΅λœ μš”μ†Œμ˜ μΆ”κ°€λŠ” ν—ˆμš©λ˜μ§€ μ•ŠλŠ”λ‹€. μ΄λ•Œ μ—λŸ¬κ°€ λ°œμƒν•˜μ§€λŠ” μ•Šκ³  λ¬΄μ‹œλœλ‹€.

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

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

  Set κ°μ²΄λŠ” κ°μ²΄λ‚˜ λ°°μ—΄κ³Ό 같이 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ λͺ¨λ“  값을 μš”μ†Œλ‘œ μ €μž₯ν•  수 μžˆλ‹€.

 

37.1.4 μš”μ†Œ 쑴재 μ—¬λΆ€ 확인

  Set 객체에 νŠΉμ • μš”μ†Œκ°€ μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•˜λ €λ©΄ Set.prototype.has λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€. has λ©”μ„œλ“œλŠ” νŠΉμ • μš”μ†Œμ˜ 쑴재 μ—¬λΆ€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λΆˆλ¦¬μ–Έ 값을 λ°˜ν™˜ν•œλ‹€.

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

console.log(set.has(2)); // true
console.log(set.has(4)); // false

 

37.1.5 μš”μ†Œ μ‚­μ œ

  Set 객체의 νŠΉμ • μš”μ†Œλ₯Ό μ‚­μ œν•˜λ €λ©΄ Set.prototype.delete λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€. delete λ©”μ„œλ“œλŠ” μ‚­μ œ 성곡 μ—¬λΆ€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λΆˆλ¦¬μ–Έ 값을 λ°˜ν™˜ν•œλ‹€.

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

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

37.1.6 μš”μ†Œ 일괄 μ‚­μ œ

 Set 객체의 λͺ¨λ“  μš”μ†Œλ₯Ό 일괄 μ‚­μ œν•˜λ €λ©΄ Set.prototype.clear λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€. clear λ©”μ„œλ“œλŠ” μ–Έμ œλ‚˜ undefinedλ₯Ό λ°˜ν™˜ν•œλ‹€.

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

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

 

37.1.7 μš”μ†Œ 순회

  Set 객체의 μš”μ†Œλ₯Ό μˆœνšŒν•˜λ €λ©΄ Set.prototype.forEasch λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€. λ˜ν•œ Set κ°μ²΄λŠ” μ΄ν„°λŸ¬λΈ”μ΄λ‹€. λ”°λΌμ„œ for...of 문으둜 μˆœνšŒν•  수 있으며, μŠ€ν”„λ ˆλ“œ 문법과 λ°°μ—΄ λ””μŠ€νŠΈλŸ­μ²˜λ§μ˜ λŒ€μƒμ΄ 될 μˆ˜λ„ μžˆλ‹€.

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}
*/

 

37.2 Map

  Map κ°μ²΄λŠ” 킀와 κ°’μ˜ 쌍으둜 이루어진 μ»¬λ ‰μ…˜μ΄λ‹€. Map κ°μ²΄λŠ” 객체와 μœ μ‚¬ν•˜μ§€λ§Œ 차이가 μžˆλ‹€.

ꡬ뢄 객체 Map 객체
ν‚€λ‘œ μ‚¬μš©ν•  수 μžˆλŠ” κ°’ λ¬Έμžμ—΄ λ˜λŠ” μ‹¬λ²Œ κ°’ 객체λ₯Ό ν¬ν•¨ν•œ λͺ¨λ“  κ°’
μ΄ν„°λŸ¬λΈ” x o
μš”μ†Œ 개수 확인 Object.keys(obj).length map.size

37.2.1 Map 객체의 생성

  Map κ°μ²΄λŠ” Map μƒμ„±μž ν•¨μˆ˜λ‘œ μƒμ„±ν•œλ‹€. Map μƒμ„±μž ν•¨μˆ˜μ— 인수λ₯Ό μ „λ‹¬ν•˜μ§€ μ•ŠμœΌλ©΄ 빈 Map 객체가 μƒμ„±λœλ‹€.

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

  Map μƒμ„±μž ν•¨μˆ˜λŠ” μ΄ν„°λŸ¬λΈ”μ„ 인수둜 전달받아 Map 객체λ₯Ό μƒμ„±ν•œλ‹€. μ΄λ•Œ 인수둜 μ „λ‹¬λ˜λŠ” μ΄ν„°λŸ¬λΈ”μ€ 킀와 κ°’μ˜ 쌍으둜 이루어진 μš”μ†Œλ‘œ κ΅¬μ„±λ˜μ–΄μ•Ό ν•œλ‹€.

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

const map2 = new Map([1,2]); // TypeError λ°œμƒ

 

37.2.2 μš”μ†Œ 개수 확인

  Map 객체의 μš”μ†Œ 개수λ₯Ό 확인할 λ•ŒλŠ” Map.prototype.sizeν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•œλ‹€.

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

37.7.3 μš”μ†Œ μΆ”κ°€

  Map 객체에 μš”μ†Œλ₯Ό μΆ”κ°€ν•  λ•ŒλŠ” Map.prototype.set λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€.

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

map.set('key1','value1');
console.log(map); // Map(1) {'key1' => 'value1'}

  set λ©”μ„œλ“œλŠ” μƒˆλ‘œμš΄ μš”μ†Œκ°€ μΆ”κ°€λœ Map 객체λ₯Ό λ°˜ν™˜ν•œλ‹€. λ”°λΌμ„œ set λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•œ 후에 set λ©”μ„œλ“œλ₯Ό μ—°μ†μ μœΌλ‘œ ν˜ΈμΆœν•  수 μžˆλ‹€.

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

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

37.2.4 μš”μ†Œ 취득

  Map κ°μ²΄μ—μ„œ νŠΉμ • μš”μ†Œλ₯Ό μ·¨λ“ν•˜λ €λ©΄ Map.prototype.get λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€. get λ©”μ„œλ“œμ˜ 인수둜 ν‚€λ₯Ό μ „λ‹¬ν•˜λ©΄ 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

37.2.5 μš”μ†Œ 쑴재 μ—¬λΆ€ 확인

  Map 객체에 νŠΉμ • μš”μ†Œκ°€ μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•˜λ €λ©΄ Map.prototype.has λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€. has λ©”μ„œλ“œλŠ” νŠΉμ • μš”μ†Œμ˜ 쑴재 μ—¬λΆ€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λΆˆλ¦¬μ–Έ 값을 λ°˜ν™˜ν•œλ‹€.

const map = new Map();

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

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

console.log(map.has(lee)); // true
console.log(map.has('key')); // false

37.2.6 μš”μ†Œ μ‚­μ œ

  Map 객체의 μš”μ†Œλ₯Ό μ‚­μ œν•˜λ €λ©΄ Map.prototype.delet λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€. delete λ©”μ„œλ“œλŠ” μ‚­μ œ 성곡 μ—¬λΆ€λ₯Ό λ‚˜νƒ€λ‚΄λŠ” λΆˆλ¦¬μ–Έ 값을 λ°˜ν™˜ν•œλ‹€.

const map = new Map();

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

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

map.delete(kim);
console.log(map); // Map(1) {{name : 'lee'} => 'developer'}

37.2.7 μš”μ†Œ 일괄 μ‚­μ œ

  Map 객체의 μš”μ†Œλ₯Ό 일괄 μ‚­μ œν•˜λ €λ©΄ Map.prototype.clear λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€. clear λ©”μ„œλ“œλŠ” μ–Έμ œλ‚˜ undefinedλ₯Ό λ°˜ν™˜ν•œλ‹€.

const map = new Map();

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

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

map.clear();
console.log(map); // Map(0) {size: 0}

37.2.8 μš”μ†Œ 순회

  Map 객체의 μš”μ†Œλ₯Ό μˆœνšŒν•˜λ €λ©΄ Map.prototype.forEach λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•œλ‹€. λ˜ν•œ Map κ°μ²΄λŠ” μ΄ν„°λŸ¬λΈ”μ΄λ―€λ‘œ for...of 문으둜 μˆœνšŒν•  수 있으며, μŠ€ν”„λ ˆλ“œ 문법과 λ°°μ—΄ λ””μŠ€νŠΈλŸ­μ²˜λ§ ν• λ‹Ήμ˜ λŒ€μƒμ΄ 될 μˆ˜λ„ μžˆλ‹€.

const map = new Map();

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

map
    .set(lee, 'developer')
    .set(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'}
*/