JS) Set, WeakSet

kangdari·2020년 4월 1일
0

Set

  • 중복이 허용되지 않으며 순서를 보장하는 값들로만 이루어진 리스트
  • 추가, 삭제, 초기화 요소의 총 개수, 포함 여부 확인
const set = new Set()
set.add(5)
set.add('5')
set.add(0)
set.add(5)

console.log(set) // Set(3) { 5, '5', 0 }
set.size // 3
set.has(5) // true
set.delete(5) 
set.has(5) // false

배열과 다르게 인덱스 개념이 없고 값으로 삭제하고 포함 여부를 확인한다.

set.clear()
set.size() // 0 
  • 초기값 지정
    인자로 iterable한 개체를 지정할 수 있음. ( 반복 가능한 개체들...)
const s = new Set([1,2,3,'1','2','3'])
  • 펼친 배열을 다시 Set으로 만들 수 있음
const ss = new Set([...s])
  • 인덱스가 없음
const set = new Set([1,2,3,4,5])
console.log(set.keys()) // SetIterator {1, 2, 3, 4, 5}
console.log(set.values()) // SetIterator {1, 2, 3, 4, 5}
console.log(set.entries()) // SetIterator {1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 => 5}

console.log(set[1]) // undefined
  • key와 value가 같다.
set.forEach(function(key, value, ownerSet){
    console.log(key, value, this)
}, {})
// 1 1 {}
// 2 2 {}
// 3 3 {}
// 4 4 {}
// 5 5 {}
  • reduce를 이용한 중복 제거 배열
const arr2 = arr.reduce((item, c) => {
    if(item.includes(c)) return item
    item.push(c)
    return item
}, [])
  • Set을 이용한 중복 제거 배열 만들기
const arr = [1,1,2,2,3,3,4,4,5,6]
const newArr = [...new Set(arr)]

console.log(newArr) // [ 1, 2, 3, 4, 5, 6 ]
  • 응용
    이렇게 makeUniqueArr 함수를 만들어 사용하면 배열의 중복을 쉽게 제거할 수 있음.
const makeUniqueArr = arr => [...new Set(arr)]

const a = [1,1,1,1,1,1,2,2,2,2,2,2,3,3,3]
makeUniqueArr(a) // [1, 2, 3]

Set 용도

  1. 중복 제거
  2. 전체 순회할 필요성이 없는 경우
  3. 값의 유무 판단

사용하기 좋지 않은 경우
1. 특정 요소에 접근
2. 인덱스가 필요한 경우

WeakSet

  • set과 비교
    set에 객체를 저장할 경우 set에도 해당 객체에 대한 참조가 연결되어, 여타의 참조가 없어지더라도 set에는 객체가 여전히 살아있음.
    반면에 WeakSet은 객체에 대한 참조카운터를 올리지 않아, 여타의 참조가 없어질 경우 WeakSet내의 객체는 GC(garbage collection)의 대상이 된다.
  1. 참조형 데이터만 요소로 삼을 수 있음.
  2. iteralbe이 아니다.
    • keys(), values(), entries(), for ..of , size() 사용 불가
  3. has()는 가능

0개의 댓글