set() 함수는 중복을 허용하지 않는다.
const nums = [1, 2, 3, 6, 6, 4, 5, 5, 3, 7, 9];
const mySet = new Set();
const uniqueNums = [...new Set(nums)]; /// spread연산자로 array 변환
console.log(uniqueNums); // {1, 2}
mySet.add(1);
mySet.add(2);
mySet.add(2); // 중복을 허용하지 않기 때문에 {1,2}만 나온다.
console.log(mySet); // [1, 2, 3, 6, 4, 5, 7, 9]
new Set()을 사용하여 빈 Set객체 mySet을 생성한다. Set은 중복을 혀용하지 않는 데이터 집합이다.
mySet.add()는 순서대로 1, 2, 2를 추가한다. Set은 중복된 값을 혀용하지 않으므로 마지막 add(2)는 무시한다.
따라서 {1, 2}만 출력된다.
indexof()는 array element를 전달을 해주면 그에 상응하는 element의 첫 번째 index를 보여준다.
const nums = [1, 2, 3, 6, 6, 4, 5, 5, 3, 7, 9];
const uniqueNums = nums.filter((item, position) => {
return nums.indexOf(item) === position;
});
console.log(uniqueNums); // [1, 2, 3, 6, 4, 5, 7, 9]
nums배열에 filter() 함수를 사용하여 주어진 조건 함수에 따라 배열을 필터링하게 만든다.
조건 함수는 각 배열 요소와 해당 요소의 인덱스('position')를 매개 변수로 받는다.
nums.indexOf(item)는 배열 nums에서 item의 첫 번째 등장 위치의 인덱스를 반환
position은 현재 배열 요소의 인덱스
조건 함수는 배열의 각 요소에 대해, 해당 요소가 처음 등장하는 위치의 인덱스가 현재 인덱스('position')와 일치하는 지 확인한다.
예를 들면,
1 0
2 1
3 2
6 3
6 4 indexof로 첫 번째 요소의 인덱스는 3 이기 때문에 false
4 5
5 6
5 7 indexof로 첫 번째 요소의 인덱스는 6 이기 때문에 false
3 8 indexof로 첫 번째 요소의 인덱스는 2 이기 때문에 false
7 9
9 10
이런 식으로 이루어지는 거 같다.
추가적인 자료구조를 사용하는 방법이다.
loop를 통해 미리 지정된 caching object에 존재 여부를 확인한다.
const nums = [1, 2, 3, 6, 6, 4, 5, 5, 3, 7, 9];
function uniqueNums(arr) {
const uniqueElements = {};
const result = [];
for (let element of arr) {
if (!uniqueElements[element]) {
result.push(element);
}
uniqueElements[element] = element;
}
return result;
}
console.log(uniqueNums(nums)); // [1, 2, 3, 6, 4, 5, 7, 9]
uniqueElements라는 객체는 각 요소의 고유한 값들을 기록하기 위해 사용된다.
result라는 배열은 중복이 제거된 값을 저장할 목적으로 사용된다.
!uniqueElements[element]는 uniqueElements 객체 내에 현재 요소의 값이 없는지 확인한다. 즉, 해당하는 값이 없다면 result.push(element)에서 배열에 추가한다.
uniqueElements[element] = element는 uniqueElements 객체에 현재 요소의 값을 등록한다.이를 통해 이후에 같은 요소가 다시 나올 경우 중복으로 처리한다.