본문 바로가기
개발(Development)/JS(자바스크립트)

[Javascript]배열 문자열/숫자 요소 중복제거, 출현횟수(개수) 구하는 방법

by 카레유 2021. 2. 2.

이 글은 ['a', 'b', 'b', 'c','c','c', 'd', 'd', 'd', 'd']와 같은 배열에서,

아래의 2가지 항목을 구하는 코드를 정리한 글이다.

 

1. 중복을 제거한 유니크한 항목 구하기

2. 각 요소의 출현 횟수(개수) 구하기

 

숫자는 물론, 문자열(string, 단어)에도 적용 가능하다.


1. 중복제거, 유니크한 항목 구하기

매개변수로 배열을 넣어 아래 함수를 호출하면, 중복을 제거한 유니크한 요소들만 배열로 반환한다.

 

<구현 코드>

function getUniques(array) {
    return [... new Set(array)];
}

 

<사용 예시>

// 1. 문자열
const strings = ['a', 'b', 'b', 'c','c','c', 'd', 'd', 'd', 'd'];
getUniques(strings);
// [ 'a', 'b', 'c', 'd' ]


// 2. 숫자
const numbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4];
getUniques(numbers);
// [ 1, 2, 3, 4 ]


// 3. 문자열+숫자
const mix = [2, 2, 3, 3, 3, 'a', 'b', 'b'];
getUniques(mix);
// [ 2, 3, 'a', 'b' ]

 

<작동 원리>

1. 배열로 Set을 생성하면서 중복 요소를 제거

2. 스프레드 문법을 통해 배열로 반환

 

2. 각 요소의 출현 횟수(개수) 구하기

파라미터로 배열을 넣어 아래함수를 호출하면, 각 요소별 개수 정보를 객체로 반환한다.

 

<구현 코드>

function getCount(array) {
    return array.reduce((pv, cv)=>{
        pv[cv] = (pv[cv] || 0) + 1;
        return pv;
    }, {});
}

 

<사용 예시>

// 1. 문자열
const strings = ['a', 'b', 'b', 'c','c','c', 'd', 'd', 'd', 'd'];
getCount(strings);
// { a: 1, b: 2, c: 3, d: 4 }


// 2. 숫자
const numbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4];
getCount(numbers);
// { '1': 1, '2': 2, '3': 3, '4': 4 }


// 3. 문자열+숫자
const mix = [2, 2, 3, 3, 3, 'a', 'b', 'b'];
getCount(mix);
// { '2': 2, '3': 3, a: 1, b: 2 }

 

<작동 원리>

1. Array.prototype.reduce 메서드를 사용한다.

2. 초기값으로 빈객체 {}를 넣어준다.

3. 파라미터로 들어온 배열을 순회하면서,,,

   1) 빈객체의 key 값으로 '배열의 요소'를 넣어주고

  2) key에 해당하는 value에는 '배열의 요소의 갯수'를 넣어준다.

 

핵심은 아래 코드인데, '단축평가'를 쓴다.

pv[cv] = (pv[cv] || 0) + 1;

 

기존에 key로 저장된게 없다면, 0으로 세팅해주고,

기존에 key로 저장된게 있다면, 기존 value에 1을 더한다.

 

결과적으로 배열의 모든 요소를 순회하면서  {'요소': 갯수, '요소', 갯수, ... }를 계산해 반환한다.

(코드 구조상 중복처리도 된다.)

 

참고로 reduce 메서드는 '초기값'에 '배열의 요소값'을 누적하여 연산한다.

 

'단축평가'에 대해서는, 상세하고 쉽게 정리한 아래 글을 참고하시면 좋을듯 하다.

[자바스크립트] 논리연산자(&&, ||) 단축평가


(참고)배열에서 최빈값을 구하고, 출현 빈도 순으로 정렬하는 방법에 대한 글

[Javascript]문자열(단어), 숫자 최빈값(mode)구하기(+빈도순 정렬) in 배열

 

 

도움이 되셨길.

 

댓글