Javascript

배열에서 중복된 값 제외하는 방법

킹king 2022. 9. 29. 16:39
반응형

 

배열에서 중복값을 걸러내야할때가 있음. 근데 이게 중복값이 몇개가 있냐, 배열이 deep한 친구냐(막 배열안에 객체있고 그런), 최신문법을 써도 되냐 등에 따라 써야할 방법이 다름. 그래서 정리함.

 

---

 

1. indexOf와 filter를 사용하기

const arr = [1, 2, 1, 3, 4, 3, 5, 1, 1, 3, 3, 1, 5];

// [1, 2, 3, 4, 5]
arr.filter(function(item, index) {
  return arr.indexOf(item) == index;
});

중복값이 있음 = indexOf로 찾았을때 index랑, filter함수 내에 index랑 값다름

을 이용한 형식임. 저 두값이 같다는 의미는 중복이 없다는 것이기떄문에 저렇게 써주면 중복없는 친구들만 빠져나옴.

 

무난한 방법.

 

 

2. set을 사용하기

const arr = [1, 2, 1, 3, 4, 3, 5, 1, 1, 3, 3, 1, 5];

[...new Set(arr)] // [1,2,3,4,5]

set 문법 자체가 고유한 값만 뽑아내기때문에 이를 이용한 형식임.

 

신규문법을 쓰지 못한다면 나가리행.

 

 

3. reduce를 사용하기

const arr = [1, 2, 1, 3, 4, 3, 5, 1, 1, 3, 3, 1, 5];

arr.sort().reduce(function(acc, curr) {
    let length = acc.length;
    if (length == 0 || acc[length - 1] != curr) {
    	acc.push(curr)
    };
    
    return acc;
}, []) // [1, 2, 3, 4, 5]

reduce는 거진 예시가 더하기 빼기같은거길래 어디다쓰나 했더니 이런곳에서도 쓰인다.

 

우선 sort()로 순서대로 정리해주는 것이 우선임.

reduce는 '쌓인값(혹은 시작값)'과 '현재값'을 왔다갔다 비교해주기때문에 중복된 친구들이 서로 옆에 있어야하기때문임.

 

예를들어 [1,1,2,3...]이라는 배열을 reduce를 돌린다면

1차 ---> [] vs 1 ---> length가 0이니까 일단 []에 1을 아묻따 넣어줌

2차 ---> [1] vs 1 ---> 이미 배열에 1이 있음. 근데 이번에 현재값도 1이다? 그러면 패스

이런식으로 진행되는것임.

 

'누산기'라는 역할이 새삼 중요했구나라는걸 깨닫게 된당..

좀더 파바야되겠음.