이 두사이트에 굉장히 잘 정리되어 있다 여기엔 아이디어들만 정리.
const array = ['C', 'A', 'B', 'A', 'C', 'D', 'C', 'C', 'E', 'D'];
console.log(array); // ['C', 'A', 'B', 'A', 'C', 'D', 'C', 'C', 'E', 'D']
let result1 = [...new Set(array)];
console.log(result1); // ['C', 'A', 'B', 'D', 'E']
let result2 = array.filter((v, i) => array.indexOf(v) === i);
console.log(result2); // ['C', 'A', 'B', 'D', 'E']
let result3 = array.reduce((ac, v) => ac.includes(v) ? ac : [...ac, v], []);
console.log(result3); // ['C', 'A', 'B', 'D', 'E']
let result4 = [];
for(v of array) {
if (!result4.includes(v)) result4.push(v);
}
console.log(result4); // ['C', 'A', 'B', 'D', 'E']
indexOf는 배열에서 해당값을 갖고 있는 가장 첫번째 인덱스를 리턴하는데 이를 filter() 함수와 같이 써서 지금 값의 인덱스가 indexOf()에서 리턴한 인덱스랑 같지 않다면 처음 나온 값이 아니다라고 걸러내어 처음 나온 값들만 새 배열에 넣어주는 방법.
새로 만든 빈 배열에 값을 넣어가는데, 넣을 때마다 그 새 배열에 이미 포함된 값인지 비교해보고 없을 때에만 넣는 방식.
이게 제일 직관적인 것 같긴하다.
이 중에서도 include()를 그냥 for문과 쓰는 방법이 있고
reduce()와 쓰는 방법이 소개되어 있는데.
reduce()를 쓴다는 거는 for문에서 쓸 때 결과를 누적시킬 새 빈 배열을 만들어서 넣어주는 과정을 reduce()에 포함시켜 축약한 형태라 볼 수 있겠다.
let result = array.reduce((ac, v) => ac.includes(v) ? ac : [...ac, v], []);
이와 같이 스프레드와 같이 썼구나.
이거도 set으로 변환시켜서 중복제거한 것과 비슷한 맥락이다.