Language/JavaScript

[JS] πŸ“š μžλ°”μŠ€ν¬λ¦½νŠΈ μžλ£Œν˜• Set 🚩 정리

인파_ 2021. 10. 5. 16:05

Set

 

μ…‹(Set)

μ…‹(Set)은 쀑볡을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” 값을 λͺ¨μ•„놓은 νŠΉλ³„ν•œ μ»¬λ ‰μ…˜μž…λ‹ˆλ‹€.

셋에 ν‚€κ°€ μ—†λŠ” 값이 μ €μž₯λ©λ‹ˆλ‹€.

let sett = new Set(["bananas", "oranges", "bananas", "apples", "bananas"]); 
// Set(3) {'bananas', 'oranges', 'apples'}

new Set(iterable) – 셋을 λ§Œλ“­λ‹ˆλ‹€. μ΄ν„°λŸ¬λΈ” 객체λ₯Ό μ „λ‹¬λ°›μœΌλ©΄(λŒ€κ°œ 배열을 μ „λ‹¬λ°›μŒ) κ·Έ μ•ˆμ˜ 값을 볡사해 셋에 λ„£μ–΄μ€λ‹ˆλ‹€.

set.add(value) – 값을 μΆ”κ°€ν•˜κ³  μ…‹ μžμ‹ μ„ λ°˜ν™˜ν•©λ‹ˆλ‹€.

set.delete(value) – 값을 μ œκ±°ν•©λ‹ˆλ‹€. 호좜 μ‹œμ μ— μ…‹ 내에 값이 μžˆμ–΄μ„œ μ œκ±°μ— μ„±κ³΅ν•˜λ©΄ true, μ•„λ‹ˆλ©΄ falseλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

set.has(value) – μ…‹ 내에 값이 μ‘΄μž¬ν•˜λ©΄ true, μ•„λ‹ˆλ©΄ falseλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

set.clear() – 셋을 λΉ„μ›λ‹ˆλ‹€.

set.size – 셋에 λͺ‡ 개의 값이 μžˆλŠ”μ§€ μ„Έμ€λ‹ˆλ‹€.

 

μ…‹ 내에 λ™μΌν•œ κ°’(value)이 μžˆλ‹€λ©΄ set.add(value)을 아무리 많이 ν˜ΈμΆœν•˜λ”λΌλ„ μ•„λ¬΄λŸ° λ°˜μ‘μ΄ 없을 κ²λ‹ˆλ‹€.

μ…‹ λ‚΄μ˜ 값에 쀑볡이 μ—†λŠ” μ΄μœ κ°€ λ°”λ‘œ 이 λ•Œλ¬Έμ΄μ£ .

​

방문자 λ°©λͺ…둝을 λ§Œλ“ λ‹€κ³  κ°€μ •ν•΄ λ΄…μ‹œλ‹€.

ν•œ λ°©λ¬Έμžκ°€ μ—¬λŸ¬ 번 방문해도 방문자λ₯Ό μ€‘λ³΅ν•΄μ„œ κΈ°λ‘ν•˜μ§€ μ•Šκ² λ‹€κ³  κ²°μ • λ‚΄λ¦° μƒν™©μž…λ‹ˆλ‹€.

즉, ν•œ λ°©λ¬ΈμžλŠ” '단 ν•œ 번만 기둝’λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

​

μ΄λ•Œ μ ν•©ν•œ μžλ£Œκ΅¬μ‘°κ°€ λ°”λ‘œ μ…‹μž…λ‹ˆλ‹€.

let set = new Set();

let john = { name: "John" };
let pete = { name: "Pete" };
let mary = { name: "Mary" };

// μ–΄λ–€ 고객(john, mary)은 μ—¬λŸ¬ 번 λ°©λ¬Έν•  수 μžˆμŠ΅λ‹ˆλ‹€.
set
  .add(john)
  .add(pete)
  .add(mary)
  .add(john)
  .add(mary); // 체이닝

// μ…‹μ—λŠ” μœ μΌλ¬΄μ΄ν•œ κ°’λ§Œ μ €μž₯λ©λ‹ˆλ‹€.
alert( set.size ); // 3

for (let user of set) {
  alert(user.name); // // John, Pete, Mary 순으둜 좜λ ₯λ©λ‹ˆλ‹€.
}

μ…‹ λŒ€μ‹  배열을 μ‚¬μš©ν•˜μ—¬ 방문자 정보λ₯Ό μ €μž₯ν•œ ν›„,

쀑볡 κ°’ μ—¬λΆ€λŠ” λ°°μ—΄ λ©”μ„œλ“œμΈ arr.findλ₯Ό μ΄μš©ν•΄ 확인할 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

ν•˜μ§€λ§Œ arr.findλŠ” λ°°μ—΄ λ‚΄ μš”μ†Œ 전체λ₯Ό λ’€μ Έ 쀑볡 값을 μ°ΎκΈ° λ•Œλ¬Έμ—, 셋보닀 μ„±λŠ₯ λ©΄μ—μ„œ λ–¨μ–΄μ§‘λ‹ˆλ‹€.

반면, 셋은 κ°’μ˜ μœ μΌλ¬΄μ΄ν•¨μ„ ν™•μΈν•˜λŠ”λ° μ΅œμ ν™”λ˜μ–΄μžˆμŠ΅λ‹ˆλ‹€.

​


Set의 κ°’μ˜ 반볡 μž‘μ—…

for..ofλ‚˜ forEachλ₯Ό μ‚¬μš©ν•˜λ©΄ μ…‹μ˜ 값을 λŒ€μƒμœΌλ‘œ 반볡 μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

let set = new Set(["oranges", "apples", "bananas"]); // {"oranges", "apples", "bananas"}

for (let value of set) alert(value);

// forEachλ₯Ό μ‚¬μš©ν•΄λ„ λ™μΌν•˜κ²Œ λ™μž‘ν•©λ‹ˆλ‹€.
set.forEach((value, valueAgain, set) => {
  alert(value);
});

ν₯미둜운 점이 λˆˆμ— λ„λ„€μš”. forEach에 쓰인 콜백 ν•¨μˆ˜λŠ” μ„Έ 개의 인수λ₯Ό λ°›λŠ”λ°,

첫 λ²ˆμ§ΈλŠ” κ°’, 두 λ²ˆμ§Έλ„ 같은 값인 valueAgain을 λ°›κ³  μžˆμŠ΅λ‹ˆλ‹€. μ„Έ λ²ˆμ§ΈλŠ” λͺ©ν‘œν•˜λŠ” 객체(μ…‹)μ΄κ³ μš”.

즉, λ™μΌν•œ 값이 μΈμˆ˜μ— 두 번 λ“±μž₯ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

​

μ΄λ ‡κ²Œ κ΅¬ν˜„λœ μ΄μœ λŠ” 맡과의 ν˜Έν™˜μ„± λ•Œλ¬Έμž…λ‹ˆλ‹€.

맡의 forEach에 쓰인 콜백이 μ„Έ 개의 인수λ₯Ό 받을 λ•Œλ₯Ό μœ„ν•΄μ„œμ£ .

이상해 λ³΄μ΄κ² μ§€λ§Œ μ΄λ ‡κ²Œ κ΅¬ν˜„ν•΄ λ†“μ•˜κΈ° λ•Œλ¬Έμ— 맡을 μ…‹μœΌλ‘œ ν˜Ήμ€ 셋을 맡으둜 κ΅μ²΄ν•˜κΈ°κ°€ μ‰½μŠ΅λ‹ˆλ‹€.

​

셋에도 맡과 λ§ˆμ°¬κ°€μ§€λ‘œ 반볡 μž‘μ—…μ„ μœ„ν•œ λ©”μ„œλ“œκ°€ μžˆμŠ΅λ‹ˆλ‹€.

set.keys() – μ…‹ λ‚΄μ˜ λͺ¨λ“  값을 ν¬ν•¨ν•˜λŠ” μ΄ν„°λŸ¬λΈ” 객체λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
set.values() – set.keys와 λ™μΌν•œ μž‘μ—…μ„ ν•©λ‹ˆλ‹€. 맡과의 ν˜Έν™˜μ„±μ„ μœ„ν•΄ λ§Œλ“€μ–΄μ§„ λ©”μ„œλ“œμž…λ‹ˆλ‹€.
set.entries() – μ…‹ λ‚΄μ˜ 각 값을 μ΄μš©ν•΄ λ§Œλ“  [value, value] 배열을 ν¬ν•¨ν•˜λŠ” μ΄ν„°λŸ¬λΈ” 객체λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. 맡과의 ν˜Έν™˜μ„±μ„ μœ„ν•΄ λ§Œλ“€μ–΄μ‘ŒμŠ΅λ‹ˆλ‹€.

Reference

https://ko.javascript.info/map-set