# * Map & Set

Written by πŸ“ Wabi

Mapκ³Ό Set은 일반적인 μ•Œκ³ λ¦¬μ¦˜μ„ κ΅¬ν˜„ν•˜λŠ”λ° 효과적으둜 μ‚¬μš©λ  수 μžˆλŠ” μžλ£Œκ΅¬μ‘°μ΄λ‹€.

  • 맡은 킀와 값을 μ—°κ²°ν•œλ‹€λŠ” μ μ—μ„œ 객체와 λΉ„μŠ·ν•˜λ‹€.
  • 셋은 쀑볡을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 점을 μ œμ™Έ ν•˜λ©΄ λ°°μ—΄κ³Ό λΉ„μŠ·ν•˜λ‹€.

# ES6 이전 킀와 값을 μ—°κ²°ν•˜λŠ”λ° 객체 μ‚¬μš©μ‹œ, μƒκΈ°λŠ” μ—¬λŸ¬κ°€μ§€ 단점.

  • ν”„λ‘œν† νƒ€μž… 체인 λ•Œλ¬Έμ— μ˜λ„ν•˜μ§€ μ•Šμ€ 연결이 생길 수 μžˆλ‹€.
  • 객체 μ•ˆμ— μ—°κ²°λœ 킀와 값이 λͺ‡ κ°œλ‚˜ λ˜λŠ”μ§€ μ‰½κ²Œ μ•Œμ•„λ‚Ό 수 μžˆλŠ” 방법이 μ—†λ‹€.
  • ν‚€λŠ” λ°˜λ“œμ‹œ λ¬Έμžμ—΄μ΄λ‚˜ 심볼이어야 ν•˜λ―€λ‘œ 객체λ₯Ό ν‚€λ‘œ μ¨μ„œ κ°’κ³Ό μ—°κ²°ν•  수 μ—†λ‹€.
  • κ°μ²΄λŠ” ν”„λ‘œνΌν‹° μˆœμ„œλ₯Ό μ „ν˜€ 보μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€.

# Map

# μ˜ˆμ‹œ 1)

const u1 = {name : 'Wabi'};
const u2 = {name : 'Yuna'};
const u3 = {name : 'Zinico'};
const u4 = {name : 'Yuri'};

const userRoles = new Map();

userRoles.set(u1, 'User');
userRoles.set(u2, 'User');
userRoles.set(u3, 'Admin');

//체인 ν”„λ‘œκ·Έλž˜λ°λ„ κ°€λŠ₯ν•˜λ‹€.
userRoles
.set(u1, 'User')
.set(u2, 'User')
.set(u3, 'Admin');
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

Note

λ©”μ„œλ“œλ₯Ό 체인으둜 μ—°κ²°ν•  수 μžˆλ‹€.

# μ˜ˆμ‹œ 2)

const userRoles = new Map([
    [u1,'User'],
    [u2,'User'],
    [u3,'Admin']
]);

userRoles.get(u2); // User

userRoles.has(u1); // true
userRoles.get(u1); // "User"
userRoles.has(u4); // false
userRoles.get(u4); // undefined

userRoles.get(u1); // 'User'
userRoles.set(u1, 'Admin');
userRoles.get(u1); // 'Admin'

userRoles.size; // 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

Note

μš”μ†Œλ₯Ό μ§€μšΈλ•ŒλŠ” delete()
λͺ¨λ‘ μ§€μšΈ λ•ŒλŠ” clear()


# WeakMap

# Map과 차이점

  • ν‚€λŠ” λ°˜λ“œμ‹œ 객체여야 ν•œλ‹€.
  • WeakMap의 ν‚€λŠ” 가비지 μ½œλ ‰μ…˜μ— 포함될 수 μžˆλ‹€.
  • WeakMap은 μ΄ν„°λŸ¬λΈ”μ΄ μ•„λ‹ˆλ©° clear() λ©”μ„œλ“œλ„ μ—†λ‹€.

Note

가비지 μ½œλ ‰μ…˜('garbage collection')은 λ©”λͺ¨λ¦¬ 관리 기법 μ€‘μ˜ ν•˜λ‚˜λ‘œ, λ™μ μœΌλ‘œ ν• λ‹Ήν–ˆλ˜ λ©”λͺ¨λ¦¬ μ˜μ—­ μ€‘μ—μ„œ ν•„μš”μ—†λŠ” μ˜μ—­μ„ ν•΄μ œν•˜λŠ” κΈ°λŠ₯이닀.

# μ˜ˆμ‹œ )

const SecretHolder = (function(){
    const secrets = new WeakMap();
    return class {
        setSecret(secret){
            secrets.set(this, secret);
        }
        getSecret(){
            return secrets.get(this);
        }
    }
})();

const a = new SecretHolder();
const b = new SecretHolder();

a.setSecret('secret A');
b.setSecret('secret B');

a.getSecret(); // secret A
b.getSecret(); // secret B
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20

# Set

쀑볡을 ν—ˆμš©ν•˜μ§€ μ•ŠλŠ” 데이터 집합

# μ˜ˆμ‹œ 1)

const roles = new Set();

roles.add('User'); // Set ['User']
roles.add('Admin'); // Set ['User','Admin']

roles.size; // 2
roles.add('User'); // Set ['User','Admin']
1
2
3
4
5
6
7

# μ˜ˆμ‹œ 2) Set, 집합연산

let setA = new Set([1, 2, 3, 4, 5]);
let setB = new Set([4, 5, 6, 7, 8]);
// 합집합
let unionSet = new Set([...setA, ...setB])
for (let value of unionSet) {
  console.log(value);
}
// μ°¨λ‘€λŒ€λ‘œ 1, 2, 3, 4, 5, 6, 7, 8 좜λ ₯

// ꡐ집합
let intersectionSet = new Set(
  [...setA].filter(v => setB.has(v))
);
for (let value of intersectionSet) {
  console.log(value);
}
// μ°¨λ‘€λŒ€λ‘œ 4, 5 좜λ ₯

// 차집합
let differenceSet = new Set(
  [...setA].filter(v => !setB.has(v))
);
for (let value of differenceSet) {
  console.log(value);
}
// μ°¨λ‘€λŒ€λ‘œ 1, 2, 3 좜λ ₯
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26

# WeakSet

WeakMap κ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ μ΄ν„°λŸ¬λΈ”μ΄ μ•„λ‹ˆκ³ , 가비지 μ½œλ ‰μ…˜μ˜ λŒ€μƒμ΄ λœλ‹€.
μ“°μ΄λŠ” μš©λ„λ‘œλŠ” 객체가 μ…‹ μ•ˆμ— μ‘΄μž¬ν•˜λŠ”μ§€ μ•„λ‹Œμ§€ 체크 μš©λ„λ‘œ 거의 쓰인닀.

# μ˜ˆμ‹œ 1)

const naughty = new WeakSet();

const children = [
    {name : 'Wabi'},
    {name : 'Yuna'}
];

naughty.add(children[1]);

for(let child of children){
    if(naughty.has(child)){
        console.log(`This child ${child.name} is naughty`);
    }else{
        console.log(`This child ${child.name} is kind and good`);
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Last Updated: 7/5/2019, 8:38:55 AM