indexOf() 함수는 배열에서 특정 값이 처음 나타나는 index를 return한다.
const arr = [1, 3, 3, 5, 8, 1, 7];
arr.indexOf(1); // 0 (index number)
arr.indexOf(3); // 1
arr.indexOf(5); // 3
arr.indexOf(8); // 4
arr.indexOf(7); // 6
그러므로, 위의 배열에서 숫자 1은 arr[5]의 값으로도 존재하지만 arr.indexOf(1)의 값은 절대 5가 나올 수 없다.
그렇다면, arr의 index 값이 arr.indexOf(element) 와 같지 않다면 그 element는 배열 안에서 중복되고 있는 것이다.
arr.indexOf(element) !== index ---> 중복된 요소
arr.indexOf(element) === index ---> 중복되지 않은 요소
filter() 함수는 filter안의 callback 함수에 정의한 부분에 대해 true로 반환되는 부분만 배열로 반환한다.
중복되지 않은 요소만 즉, arr.indexOf(element) === index 가 true 인 요소만 배열로 반환하려고 한다.
const arrOnly = arr.filter((element, index) => {
return arr.indexOf(element) === index;
})
전체 과정을 함수로 적어보면 아래와 같다.
function func(arr) {
const arrOnly = arr.filter((element, index) => {
return arr.indexOf(element) === index;
})
return arrOnly;
}
func(arr);
console.log(func(arr));