Set๊ณผ Map
Set
Set
๊ฐ์ฒด๋ ์ค๋ณต๋์ง ์๋ ์ ์ผํ ๊ฐ๋ค์ ์งํฉ์ด๋ค.
Set
๊ฐ์ฒด๋ ๋ฐฐ์ด๊ณผ ์ ์ฌํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ ์ฐจ์ด๊ฐ ์๋ค.
๊ตฌ๋ถ |
๋ฐฐ์ด |
Set๊ฐ์ฒด |
๋์ผํ ๊ฐ์ ์ค๋ณตํ์ฌ ํฌํจ ํ ์ ์๋ค |
O |
X |
์์ ์์์ ์๋ฏธ๊ฐ ์๋ค. |
O |
X |
์ธ๋ฑ์ค๋ก ์์์ ์ ๊ทผํ ์ ์๋ค. |
O |
X |
Set
์ ์ํ์ ์งํฉ์ ๊ตฌํํ๊ธฐ ์ํ ์๋ฃ๊ตฌ์กฐ ์
๋๋ค, ๊ต์งํฉ, ํฉ์งํฉ, ์ฐจ์งํฉ, ์ฌ์งํฉ ๋ฑ์ ๊ตฌํํ ์ ์๋ค.
Set ๊ฐ์ฒด์ ์์ฑ
Set
์์ฑ์ ํจ์์ ์ธ์๋ฅผ ์ ๋ฌํ์ง ์์ผ๋ฉด ๋น Set ๊ฐ์ฒด๊ฐ ์์ฑ ๋ฉ๋๋ค.
Set
์์ฑ์ ํจ์๋ ์ดํฐ๋ฌ๋ธ์ ์ธ์๋ก ์ ๋ฌ๋ฐ์ Set ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค. (์ด๋, ์ค๋ณต๋ ๊ฐ์ Set ๊ฐ์ฒด์ ์์๋ก ์ ์ฅ๋์ง ์๋๋ค.)
Set
๊ฐ์ฒด์ ํน์ฑ์ ํ์ฉํด์ ๋ฐฐ์ด์ ์ค๋ณต๋ ์์๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
const set= new Set(); // ๋น set ๊ฐ์ฒด
// ์ค๋ณต ์์๋ ์ ์ฅ x
const set2 = new Set([1,2,2,3,4]);
console.log(set2); // Set(4) {1, 2, 3, 4}
// Set์ ํ์ฉํ ๋ฐฐ์ด์ ์ค๋ณต ์์ ์ ๊ฑฐ
const uniq = (arr) => [... new Set(arr)];
console.log(uniq([2,1,2,3,4,3,4])); // [2,1,3,4]
์์ ๊ฐ์ ํ์ธ
Set
๊ฐ์ฒด์ ์์ ๊ฐ์๋ฅผ ํ์ธํ ๋๋ Set.prototype.size
ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
- size ํ๋กํผํฐ๋ getterํจ์๋ง ์กด์ฌํ๋ ์ ๊ทผ์ ํ๋กํผํฐ ๋ฐ๋ผ์ sizeํ๋กํผํฐ์ ์ซ์๋ฅผ ํ ๋นํ์ฌ Set๊ฐ์ฒด์ ์์ ๊ฐ์๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค.
const {size} = new Set([1,2,3,3]);
console.log(size); // 3
์์ ์ถ๊ฐ
Set
๊ฐ์ฒด์ ์์๋ฅผ ์ถ๊ฐํ ๋๋ Set.prototype.add
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
add
๋ฉ์๋๋ ์๋ก์ด ์์๊ฐ ์ถ๊ฐ๋ ์๋ก์ด Set
๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค. ์ฐ์์ ์ผ๋ก ํธ์ถ์ด ๊ฐ๋ฅ(method chaining
)
const set = new Set();
set.add(1);
console.log(set); // Set(1) {1}
set.add(2).add(3);
console.log(set); // Set(3) {1, 2, 3}
Set
๊ฐ์ฒด๋ ๊ฐ์ฒด๋ ๋ฐฐ์ด๊ณผ ๊ฐ์ด ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ชจ๋ ๊ฐ์ ์์๋ก ์ ์ฅํ ์ ์๋ค.
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
๊ฐ์ฒด์ ํน์ ์์๊ฐ ์กด์ฌํ๋์ง ํ์ธ ํ๋ ค๋ฉด Set.prototype.has
๋ฉ์๋๋ฅผ ์ฌ์ฉ
- ์กด์ฌ ์ฌ๋ถ์ ๋ฐ๋ผ ๋ถ๋ฆฌ์ธ ๊ฐ์ ๋ฆฌํดํฉ๋๋ค.
const set = new Set([1,2,3]);
console.log(set.has(2)); // true
console.log(set.has(4)); // false
์์ ์ญ์
Set
๊ฐ์ฒด์ ํน์ ์์๋ฅผ ์ญ์ ํ๋ ค๋ฉด Set.prototype.delete
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
- ์ญ์ ์ฑ๊ณต ์ฌ๋ถ๋ฅผ ๋ํ๋ด๋ ๋ถ๋ฆฌ์ธ ๊ฐ์ ๋ฐํํ๋ค. (method chaining ๋ถ๊ฐ)
delete
๋ฉ์๋์๋ ์ธ๋ฑ์ค๊ฐ ์๋๋ผ ์ญ์ ํ๋ ค๋ ์์๊ฐ์ ์ธ์๋ก ์ ๋ฌํด์ผ ํ๋ค.
(Set
๊ฐ์ฒด๋ ์์์ ์๋ฏธ๊ฐ ์๊ธฐ๋๋ฌธ์, ๋ฐฐ์ด๊ณผ ๊ฐ์ด ์ธ๋ฑ์ค ๊ฐ์ง ์๋๋ค.)
- ์กด์ฌ ํ์ง ์๋
Set
๊ฐ์ฒด์ ์์๋ฅผ ์ญ์ ํ๋ฉด ์๋ฌ ์์ด ๋ฌด์ ๋จ
const set = new Set([1,2,3]);
// ์์ 2 ์ญ์
set.delete(2);
console.log(set); // Set(2) {1,3}
// ์กด์ฌํ์ง ์๋ ์์ ์ญ์ ์ ๋ฌด์ ๋จ
set.delete(4);
console.log(set); // Set(2) {1,3}
์์ ์ผ๊ด ์ญ์
Set
๊ฐ์ฒด์ ๋ชจ๋ ์์๋ฅผ ์ผ๊ด ์ญ์ ํ๋ ค๋ฉด Set.prototype.clear
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค. (clear ๋ฉ์๋๋ ํญ์ undefined ๋ฐํ)
const set = new Set([1,2,3]);
set.clear();
console.log(set); // Set(0) {}
์์ ์ํ
Set
๊ฐ์ฒด์ ์์๋ฅผ ์ํํ๋ ค๋ฉด Set.prototype.forEach
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
Array.prototype.forEach
๋ฉ์๋์ ์ ์ฌํ๊ฒ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ๋ฌ๋ฐ์, ์ฝ๋ฐฑ ํจ์์ 3๊ฐ์ ์ธ์๋ฅผ ์ ๋ฌ
- ์ฒซ ๋ฒ์งธ ์ธ์ : ํ์ฌ ์ํ ์ค์ธ ์์๊ฐ
- ๋ ๋ฒ์งธ ์ธ์ : ํ์ฌ ์ํ ์ค์ธ ์์๊ฐ
- ์ธ ๋ฒ์งธ ์ธ์ : ํ์ฌ ์ํ ์ค์ธ Set ๊ฐ์ฒด ์์ฒด
์ฒซ ๋ฒ์ฌ ์ธ์์ ๋ ๋ฒ์งธ ์ธ์๊ฐ ๊ฐ์ ๊ฐ์ ๊ฐ๋๋ฐ, ์ด๋ Array.prototype.forEach
์ ์ธํฐํ์ด์ค๋ฅผ ๋ง์ถ๊ธฐ ์ํจ
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}
*/
- Set ๊ฐ์ฒด๋ ์ดํฐ๋ฌ๋ธ ์ด๋ฏ๋ก
for ... of
๋ฌธ์ผ๋ก ์ํํ ์ ์์ผ๋ฉฐ, ์คํ๋ ๋ ๋ฌธ๋ฒ๊ณผ ๋ฐฐ์ด ๋์คํธ๋ญ์ฒ๋ง์ ๋์์ด ๋ ์๋ ์๋ค.
์งํฉ ์ฐ์ฐ
Set
๊ฐ์ฒด๋ ์ํ์ ์งํฉ์ ๊ตฌํํ๊ธฐ ์ํ ์๋ฃ๊ตฌ์กฐ ์ด๋ค.
๊ต์งํฉ ๊ตฌํ
// ๋ฐฉ๋ฒ1
Set.prototype.intersection = function (set){
const result = new Set();
for(const value of set) {
if(this.has(value)) result.add(value);
}
return result;
};
// ๋ฐฉ๋ฒ2
Set.prototype.intersection = function (set) {
return new Set([...this].filter(v => set.has(v)));
};
ํฉ์งํฉ ๊ตฌํ
// ๋ฐฉ๋ฒ1
Set.prototype.union = function (set) {
// this(Set ๊ฐ์ฒด)๋ฅผ ๋ณต์ฌ
const result = new Set(this);
for(const value of set) {
result.add(value);
}
return result;
};
// ๋ฐฉ๋ฒ2
Set.prototype.union = function (set) {
return new Set([...this, ...set]);
};
์ฐจ์งํฉ ๊ตฌํ
// ๋ฐฉ๋ฒ1
Set.prototype.difference = function (set) {
const result = new Set(this);
for(const value of set) {
result.delete(value);
}
return result;
};
// ๋ฐฉ๋ฒ2
Set.prototype.difference = function (set) {
return new Set([...this].filter(v => !set.has(v)));
};
๋ถ๋ถ ์งํฉ
// ๋ฐฉ๋ฒ1
Set.prototype.isSuperset = function (subset) {
for(const value of subset) {
// ๋ชจ๋ ์์๊ฐ ํฌํจ ๋๋์ง ํ์ธ
if(!this.has(value))return false;
}
return true;
};
// ๋ฐฉ๋ฒ2
Set.prototype.isSuperSet = function (subset) {
const superSet = [...this];
return [...subset].every(v => superSet.includes(v));
}
Map
Map
๊ฐ์ฒด๋ ํค์ ๊ฐ์ ์์ผ๋ก ์ด๋ฃจ์ด์ง ์ปฌ๋ ์
์ด๋ค.
- ๊ฐ์ฒด์ ์ ์ฌํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ ์ฐจ์ด๊ฐ ์๋ค.
๊ตฌ๋ถ |
๊ฐ์ฒด |
Map ๊ฐ์ฒด |
ํค๋ก ์ฌ์ฉํ ์ ์๋ ๊ฐ |
string , Symbol |
๊ฐ์ฒด๋ฅผ ํฌํจํ ๋ชจ๋ ๊ฐ |
์ดํฐ๋ฌ๋ธ |
X |
O |
์์ ๊ฐ์ ํ์ธ |
Object.keys(obj).length |
map.size |
Map ๊ฐ์ฒด์ ์์ฑ
Map
์์ฑ์ ํจ์๋ก ์์ฑ
Map
์์ฑ์ ํจ์๋ ์ดํฐ๋ฌ๋ธ์ ์ธ์๋ก ์ ๋ฌ๋ฐ์ Map ๊ฐ์ฒด๋ฅผ ์์ฑ, ์ด๋ ์ ๋ฌ๋๋ ์ดํฐ๋ฌ๋ธ์ ํค์ ๊ฐ์ ์ธ์๋ก ์ด๋ฃจ์ด์ง ์์๋ก ๊ตฌ์ฑ๋์ด์ผ ํ๋ค.
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: Iterator value 1 is not an entry object
// ์ค๋ณต๋ ํค ๋ถ๊ฐ๋ฅ
const map = new Map([['key1', 'value1'], ['key1', 'value2']]);
console.log(map); // Map(1) {"key1" => "value2"}
์์ ๊ฐ์ ํ์ธ
Map.prototype.size
๋ฅผ ์ฌ์ฉํ์ฌ ์์ ๊ฐ์ ํ์ธ
size
๋ฉ์๋๋ getterํจ์๋ง ์กด์ฌํ๋ ์ ๊ทผ์ ํ๋กํผํฐ (์ฆ ์ฌ์ด์ฆ ํ ๋นํ์ฌ ๋ณ๊ฒฝ ๋ถ๊ฐ)
const { size } = new Map([['key1', 'value1'], ['key2', 'value2']]);
console.log(size); // 2
์์ ์ถ๊ฐ
Map.prtototype.set
๋ฉ์๋ ์ฌ์ฉํ์ฌ ์์๋ฅผ ์ถ๊ฐ
- set ๋ฉ์๋๋ ์๋ก์ด ์์๊ฐ ์ถ๊ฐ๋ Map ๊ฐ์ฒด๋ฅผ ๋ฐํ(Method Chaining ๊ฐ๋ฅ)
const map = new Map();
map
.set('key1', 'value1')
.set('key2', 'value2');
console.log(map); // Map(2) {"key1" => "value1", "key2" => "value2"}
- ๊ฐ์ฒด๋ ๋ฌธ์์ด ๋๋ ์ฌ๋ฒ ๊ฐ๋ง ํค๋ก ์ฌ์ฉ๊ฐ๋ฅํ์ง๋ง 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.prototype.get
๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
get
๋ฉ์๋์ ์ธ์๋ก ํค๋ฅผ ์ ๋ฌํ๋ฉด ์ ๋ฌํ ํค๋ฅผ ๊ฐ๋ ๊ฐ์ ๋ฐํ
- ํค์ ๋ง๋ ์์๊ฐ ์กด์ฌํ์ง ์์ผ๋ฉด
undefined
๋ฐํ
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
์์ ์กด์ฌ ์ฌ๋ถ ํ์ธ
const lee = { name: "Lee" };
const kim = { name: "Kim" };
const map = new Map([
[lee, "developer"],
[kim, "designer"],
]);
map.has(lee); // true
map.has("key"); // false
์์ ์ญ์
Map.prototype.delete
์ฌ์ฉํ์ฌ ์์ ์ญ์
delete
๋ฉ์๋๋ ์ญ์ ์ฑ๊ณต ์ฌ๋ถ๋ฅผ ๋ถ๋ฆฌ์ธ ๊ฐ์ผ๋ก ๋ฐํ(Method Chaining
๋ถ๊ฐ)
- ์กด์ฌ ํ์ง ์๋ ํค๋ก ์ญ์ ์ ๋ฌด์ ๋จ
์์ ์ผ๊ด ์ญ์
Map.prototype.clear
๋ฉ์๋ ์ฌ์ฉ
clear
๋ฉ์๋๋ ์ธ์ ๋ undefined
๋ฐํ
์์ ์ํ
Map.prototype.forEach
๋ฉ์๋ ์ฌ์ฉ
forEach
๋ฉ์๋์ ์ธ์๋ก ์ ๋ฌ๋๋ ์ฝ๋ฐฑํจ์๋ 3๊ฐ์ง ์ธ์๋ฅผ ์ ๋ฌ ๋ฐ์
- ์ฒซ ๋ฒ์งธ ์ธ์ : ํ์ฌ ์ํ ์ค์ธ ์์ ๊ฐ
- ๋ ๋ฒ์งธ ์ธ์ : ํ์ฌ ์ํ ์ค์ธ ์์ ํค
- ์ธ ๋ฒ์ฌ ์ธ์ : ํ์ฌ ์ํ ์ค์ธ
Map
๊ฐ์ฒด ์์ฒด
Map
๊ฐ์ฒด๋ ์ดํฐ๋ฌ๋ธ ์ด๊ธฐ ๋๋ฌธ์ for ... of
์ํ ๊ฐ๋ฅ, ์คํ๋ ๋ ๋ฌธ๋ฒ๊ณผ ๋ฐฐ์ด ๋์คํธ๋ญ์ฒ๋ง ํ ๋น ๊ฐ๋ฅ
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"
}
*/
- Map ๊ฐ์ฒด๋ ์ดํฐ๋ฌ๋ธ์ด๋ฉด์ ๋์์ ์ดํฐ๋ ์ดํฐ์ธ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๋ฉ์๋๋ฅผ ์ ๊ณต
Map ๋ฉ์๋ |
์ค๋ช
|
Map.prototype.keys |
Map ๊ฐ์ฒด์์ ์์ ํค๋ฅผ ๊ฐ์ผ๋ก ๊ฐ๋ ์ดํฐ๋ฌ๋ธ์ด๋ฉด์ ๋์์ ์ดํฐ๋ ์ดํฐ์ธ ๊ฐ์ฒด ๋ฐํ |
Map.prototype.values |
Map ๊ฐ์ฒด์์ ์์ ๊ฐ์ ๊ฐ์ผ๋ก ๊ฐ๋ ์ดํฐ๋ฌ๋ธ์ด๋ฉด์ ๋์์ ์ดํฐ๋ ์ดํฐ์ธ ๊ฐ์ฒด ๋ฐํ |
Map.prototype.entries |
Map ๊ฐ์ฒด์์ ์์ ํค์ ์์ ๊ฐ์ ๊ฐ์ผ๋ก ๊ฐ๋ ์ดํฐ๋ฌ๋ธ์ด๋ฉด์ ๋์์ ์ดํฐ๋ ์ดํฐ์ธ ๊ฐ์ฒด ๋ฐํ |
Map
๊ฐ์ฒด๋ ์์์ ์์์ ์๋ฏธ๋ฅผ ๊ฐ์ง ์์ง๋ง ์ํํ๋ ์์๋ ์์๊ฐ ์ถ๊ฐ๋ ์์๋ฅผ ๋ฐ๋ฆ (๋ค๋ฅธ ์ดํฐ๋ฌ๋ธ ์ํ์ ํธํ์ฑ์ ์ ์งํ๊ธฐ ์ํจ)
๋๊ธ