๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋…์„œ ๋ชฉ๋ก/๋ชจ๋”ฅ๋‹ค Modern JS Deep Dive

[๋ชจ๋”ฅ๋‹ค] 37์žฅ Set๊ณผ Map

728x90

 

๐Ÿง 37.1 Set

 

Set ๊ฐ์ฒด๋Š” ์ค‘๋ณต๋˜์ง€ ์•Š๋Š” ์œ ์ผํ•œ ๊ฐ’๋“ค์˜ ์ง‘ํ•ฉ. 

Set ๊ฐ์ฒด๋Š” ๋ฐฐ์—ด๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค. 

 

<๋ฐฐ์—ด์€ ๋˜์ง€๋งŒ Set์€ ์•ˆ๋˜๋Š” ํŠน์ง•>

- ๋™์ผํ•œ ๊ฐ’์„ ์ค‘๋ณตํ•˜์—ฌ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค.

- ์š”์†Œ ์ˆœ์„œ์— ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค.

- ์ธ๋ฑ์Šค๋กœ ์š”์†Œ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

set ์€ ์ˆ˜ํ•™์  ์ง‘ํ•ฉ์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์ž๋ฃŒ๊ตฌ์กฐ๋‹ค. 

set ์„ ํ†ตํ•ด ๊ต์ง‘ํ•ฉ, ํ•ฉ์ง‘ํ•ฉ, ์ฐจ์ง‘ํ•ฉ, ์—ฌ์ง‘ํ•ฉ ๋“ฑ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

37.1.1 Set ๊ฐ์ฒด์˜ ์ƒ์„ฑ

 

const set = new Set();

Set ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์ƒ์„ฑ. 

์ธ์ˆ˜๋ฅผ ์ „๋‹ฌํ•˜์ง€ ์•Š์œผ๋ฉด ๋นˆ Set ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋จ.

Set ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋Š” ์ดํ„ฐ๋Ÿฌ๋ธ”์„ ์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›์•„ Set ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

์ด๋•Œ ์ดํ„ฐ๋Ÿฌ๋ธ”์˜ ์ค‘๋ณต๋œ ๊ฐ’์€ Set ๊ฐ์ฒด์— ์š”์†Œ๋กœ ์ €์žฅ๋˜์ง€ ์•Š์Œ.

const set1 = new Set([1, 2, 3, 4, 5, 5, 5, 6]);
console.log(set1) //Set(6) { 1, 2, 3, 4, 5, 6 }

 

๋ฐฐ์—ด์˜ ์ค‘๋ณต ์š”์†Œ ์ œ๊ฑฐ ํ•  ๋•Œ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

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

 

 

37.1.2 ์š”์†Œ ๊ฐœ์ˆ˜ ํ™•์ธ - Set.prototype.size()

 

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

 

์‚ฌ์ด์ฆˆ๋ฅผ ์ž„์˜๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

 

 

37.1.3 ์š”์†Œ ์ถ”๊ฐ€ - Set.prototype.add()

 

const uniq = new Set([1, 2, 3, 3, 3]);
console.log(uniq.add(5));

set.add ๋ฅผ ์‚ฌ์šฉํ•จ.

์ค‘๋ณต๋œ ๊ฐ’์€ ๋ฌด์‹œํ•˜๊ณ  ์ถ”๊ฐ€๋œ๋‹ค. (๋”ฐ๋กœ ์—๋Ÿฌ๊ฐ€ ๋‚˜์ง„ ์•Š์Œ)

 

NaN ๊ณผ NaN ์€ ๋‹ค๋ฅด๋‹ค๊ณ  ํ‰๊ฐ€ํ•˜์ง€๋งŒ Set ์—์„œ๋Š” ์ค‘๋ณต ์ถ”๊ฐ€๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค. 

0๊ณผ -0์€ ๊ฐ™๋‹ค๊ณ  ํ‰๊ฐ€ํ•ด์„œ ์ค‘๋ณต ์ถ”๊ฐ€ ํ—ˆ์šฉ ์•ˆ๋จ.

console.log(NaN === NaN); //false
console.log(0 === -0); //true

const set = new Set();
set.add(NaN).add(NaN);
set.add(0).add(-0);
console.log(set); //Set(2) { NaN, 0 }

 

 

Set ๊ฐ์ฒด๋Š” ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด๊ณผ ๊ฐ™์ด JS ์˜ ๋ชจ๋“  ๊ฐ’์„ ์š”์†Œ๋กœ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

37.1.4 ์š”์†Œ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ - Set.prototype.has()

 

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

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

 

 

37.1.5 ์š”์†Œ ์‚ญ์ œ - Set.prototype.delete()

 

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

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

์กด์žฌํ•˜์ง€ ์•Š๋Š” ์š”์†Œ๋ฅผ ์‚ญ์ œํ•˜๋ ค ํ•˜๋ฉด ์—๋Ÿฌ ์—†์ด ๋ฌด์‹œ๋จ.

 

delete ๋ฉ”์„œ๋“œ๋Š” ์‚ญ์ œ ์„ฑ๊ณต ์—ฌ๋ถ€๋ฅผ boolean ์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

=> add().add() ์ด๋ ‡๊ฒŒ ์—ฐ์†์ ์œผ๋กœ ์‚ฌ์šฉํ•œ ๊ฒƒ์ฒ˜๋Ÿผ delete().delete() ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ โŒ

 

 

37.1.6 ์š”์†Œ ์ผ๊ด„ ์‚ญ์ œ - Set.prototype.clear()

 

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

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

 

 

37.1.7 ์š”์†Œ ์ˆœํšŒ

 

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 }

 1, 2๋ฒˆ ์งธ ์š”์†Œ๋Š” ๊ฐ™์€ ๊ฐ’์ธ๋ฐ, forEach ๋ฉ”์„œ๋“œ์™€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ต์ผํ•˜๊ธฐ ์œ„ํ•จ์ด๋ฉฐ ๋‹ค๋ฅธ ์˜๋ฏธ๋Š” ์—†๋‹ค.

 

Set ๊ฐ์ฒด๋Š” ์ดํ„ฐ๋Ÿฌ๋ธ” => for...of ๋ฌธ์œผ๋กœ ์ˆœํšŒ ๊ฐ€๋Šฅ & ์Šคํ”„๋ ˆ๋“œ ๋ฌธ๋ฒ•๊ณผ ๋ฐฐ์—ด ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง์˜ ๋Œ€์ƒ์ด ๋  ์ˆ˜๋„ ์žˆ๋‹ค.

 

 

37.1.8 ์ง‘ํ•ฉ ์—ฐ์‚ฐ

๊ต์ง‘ํ•ฉ, ํ•ฉ์ง‘ํ•ฉ ๋“ฑ => array ๋กœ ๋ฐ”๊ฟ”์„œ ์›ํ•˜๋Š” ๊ฐ’์œผ๋กœ ๊ฑธ๋Ÿฌ๋ƒ„

 

 

 

 

 

๐Ÿง 37.2 Map

 

Map ์€ ๊ฐ์ฒด์˜ ํ‚ค์›Œ ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์ปฌ๋ ‰์…˜. 

๊ฐ์ฒด์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ์ฐจ์ด์ ์ด ์žˆ๋‹ค. 

 

๊ตฌ๋ถ„ ๊ฐ์ฒด Map ๊ฐ์ฒด
ํ‚ค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’ ๋ฌธ์ž์—ด ๋˜๋Š” ์‹ฌ๋ฒŒ ๊ฐ’ ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ๊ฐ’
์ดํ„ฐ๋Ÿฌ๋ธ” X O
์š”์†Œ ๊ฐœ์ˆ˜ ํ™•์ธ  Object.keys(obj).length map.size

 

 

 

37.2.1 Map ๊ฐ์ฒด์˜ ์ƒ์„ฑ

 

Map ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋กœ ์ƒ์„ฑํ•จ.

์ธ์ˆ˜๋กœ ์ „๋‹ฌ๋˜๋Š” ์ดํ„ฐ๋Ÿฌ๋ธ”์€ ํ‚ค์™€ ๊ฐ’์˜ ์Œ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ์š”์†Œ๋กœ ๊ตฌ์„ฑ๋˜์–ด์•ผํ•จ.

 

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

const map1 = new Map([['a', 'hello'], ['b', 'hi']])
console.log(map1); //Map(2) { 'a' => 'hello', 'b' => 'hi' }

 

์ค‘๋ณต๋œ ํ‚ค๋ฅผ ๊ฐ–๋Š” ์š”์†Œ๊ฐ€ ์กด์žฌํ•˜๋ฉด ๊ฐ’์ด ๋ฎ์–ด์จ์ง„๋‹ค. 

 

 

37.2.2 ์š”์†Œ ๊ฐœ์ˆ˜ ํ™•์ธ - Map.prototype.size()

 

const map = new Map([['a', 'hello'], ['b', 'hi']])
console.log(map.size); //2

size ๋กœ Map ๊ฐ์ฒด ์š”์†Œ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋‹ค.

 

 

37.2.3 ์š”์†Œ ์ถ”๊ฐ€ - Map.prototype.set()

 

const map = new Map([['a', 'hello'], ['b', 'hi']])
map.set("c", 'bye')
console.log(map); //Map(3) { 'a' => 'hello', 'b' => 'hi', 'c' => 'bye' }

 

์ƒˆ๋กœ ์ถ”๊ฐ€๋œ Map ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ธฐ ๋•Œ๋ฌธ์— set ๋ฉ”์„œ๋“œ๋ฅผ ์—ฐ์†์ ์œผ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

const map = new Map([['a', 'hello'], ['b', 'hi']])
map.set("c", 'bye')
console.log(map.set("d", "lalalal")); 
//Map(4) { 'a' => 'hello', 'b' => 'hi', 'c' => 'bye', 'd' => 'lalalal' }

 

 

Set๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ NaN๊ณผ NaN, 0๊ณผ -0 ์€ ์ค‘๋ณต ์ถ”๊ฐ€๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

 

Map ๊ฐ์ฒด๋Š” ํ‚ค ํƒ€์ž…์— ์ œํ•œ์ด ์—†๋‹ค. 

๋”ฐ๋ผ์„œ ๊ฐ์ฒด๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ๊ฐ’์„ ํ‚ค๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

(์ผ๋ฐ˜ ๊ฐ์ฒด์™€ ๊ฐ€์žฅ ๋‘๋“œ๋Ÿฌ์ง€๋Š” ์ฐจ์ด์ ์ด๋‹ค) 

const map = new Map([['a', 'hello'], ['b', 'hi']])
map.set("c", 'bye')
console.log(map.set({ A: "A!!" }, "lalalal"));
/**Map(4) {
  'a' => 'hello',
  'b' => 'hi',
  'c' => 'bye',
  { A: 'A!!' } => 'lalalal'
} */

 

 

37.2.4 ์š”์†Œ ์ทจ๋“ - Map.prototype.get()

์ธ์ˆ˜๋กœ ํ‚ค๋ฅผ ์ „๋‹ฌ -> ๊ฐ’์„ ๋ฐ˜ํ™˜

 

const map = new Map([['a', 'hello'], ['b', 'hi']])
map.set("c", 'bye').set({ A: "A!!" }, "lalalal");
console.log(map.get("c")) //bye

 

 

37.2.5 ์š”์†Œ ์กด์žฌ ์—ฌ๋ถ€ ํ™•์ธ - Map.prototype.has()

 

const map = new Map([['a', 'hello'], ['b', 'hi']])
map.set("c", 'bye').set({ A: "A!!" }, "lalalal");
console.log(map.has("a")) //true

 

 

37.2.6 ์š”์†Œ ์‚ญ์ œ - Map.prototype.delete()

ํ‚ค ๊ฐ’์„ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•œ๋‹ค. 

const map = new Map([['a', 'hello'], ['b', 'hi']])
map.set("c", 'bye').set({ A: "A!!" }, "lalalal");
map.delete({ A: "A!!" });
console.log(map)

//
Map(4) {
  'a' => 'hello',
  'b' => 'hi',
  'c' => 'bye',
  { A: 'A!!' } => 'lalalal'
}

 

๊ฐ์ฒด๊ฐ€ key ์ธ ๊ฒฝ์šฐ, ๊ฐ์ฒด ์ž์ฒด๋ฅผ ๋„ฃ์œผ๋ฉด ์ „ํ˜€ ์‚ญ์ œ๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค.

const map = new Map([['a', 'hello'], ['b', 'hi']])
const key1 = { A: "A!!" };
map.set("c", 'bye').set(key1, "lalalal");
map.delete(key1);
console.log(map);
//Map(3) { 'a' => 'hello', 'b' => 'hi', 'c' => 'bye' }

๊ฐ์ฒด์ธ key ๋ฅผ ๋”ฐ๋กœ ๋ณ€์ˆ˜๋กœ ํ• ๋‹นํ•ด์ค€ ๋’ค, 

์‚ญ์ œ ์‹œ ๋ณ€์ˆ˜๋ฅผ ์ ์–ด์ฃผ๋ฉด ์‚ญ์ œ๊ฐ€ ๋œ๋‹ค.

 

 

37.2.7 ์š”์†Œ ์ผ๊ด„ ์‚ญ์ œ - Map.prototype.clear()

 

์–ธ์ œ๋‚˜ undefined ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

const map = new Map([['a', 'hello'], ['b', 'hi']])
const key1 = { A: "A!!" };
map.set("c", 'bye').set(key1, "lalalal");
console.log(map.clear()); //undefined

 

 

37.2.7 ์š”์†Œ ์ˆœํšŒ 

 

forEach ์‚ฌ์šฉ ๊ฐ€๋Šฅ. 

์ธ์ž๋Š” ๊ฐ’, ํ‚ค, Map ๊ฐ์ฒด ์ˆœ์ด๋‹ค.

const map = new Map([['a', 'hello'], ['b', 'hi']])
const key1 = { A: "A!!" };
map.set("c", 'bye').set(key1, "lalalal");

map.forEach((value, key, map) => console.log(value, key, map));

//
hello a Map(4) {
  'a' => 'hello',
  'b' => 'hi',
  'c' => 'bye',
  { A: 'A!!' } => 'lalalal'
}
hi b Map(4) {
  'a' => 'hello',
  'b' => 'hi',
  'c' => 'bye',
  { A: 'A!!' } => 'lalalal'
}
bye c Map(4) {
  'a' => 'hello',
  'b' => 'hi',
  'c' => 'bye',
  { A: 'A!!' } => 'lalalal'
}
lalalal { A: 'A!!' } Map(4) {
  'a' => 'hello',
  'b' => 'hi',
  'c' => 'bye',
  { A: 'A!!' } => 'lalalal'
}

 

์ดํ„ฐ๋Ÿฌ๋ธ”์ด๋ผ for... of ๋ฌธ์œผ๋กœ๋„ ์ˆœํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

 

const map = new Map([['a', 'hello'], ['b', 'hi']])
const key1 = { A: "A!!" };
map.set("c", 'bye').set(key1, "lalalal");

for (const item of map) {
    console.log(item)
}

//
[ 'a', 'hello' ]
[ 'b', 'hi' ]
[ 'c', 'bye' ]
[ { A: 'A!!' }, 'lalalal' ]

 

Map ๊ฐ์ฒด๋Š” ์ดํ„ฐ๋Ÿฌ๋ธ”์ด๋ฉด์„œ ๋™์‹œ์— ์ดํ„ฐ๋ ˆ์ดํ„ฐ์ธ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์ œ๊ณตํ•จ.

() ๋ฅผ ๋ถ™์—ฌ์ค˜์•ผ ์ •์ƒ ์ž‘๋™ํ•œ๋‹ค.

const map = new Map([['a', 'hello'], ['b', 'hi']])
const key1 = { A: "A!!" };
map.set("c", 'bye').set(key1, "lalalal");

console.log(map.keys());
console.log(map.values());
console.log(map.entries());

//
[Map Iterator] { 'a', 'b', 'c', { A: 'A!!' } }
[Map Iterator] { 'hello', 'hi', 'bye', 'lalalal' }
[Map Entries] {
  [ 'a', 'hello' ],
  [ 'b', 'hi' ],
  [ 'c', 'bye' ],
  [ { A: 'A!!' }, 'lalalal' ]
}

 

728x90
๋ฐ˜์‘ํ˜•