문자열(string, 단어)이나 숫자가 포함된 배열에서 아래의 두가지를 구하는 방법을 정리한다.
1. 최빈값(mode: 최다 출현 요소) 구하기
2. 출현 횟수 순 정렬하기(+ 각요소의 개수 파악)
예를 들면, [ 'apple', 'banana', 'banana', 'carrrot', 'carrrot', 'carrrot'] 와 같은 배열에서
개수가 가장 많은 'carrot'를 뽑아내거나,(최빈값)
출현빈도 순으로 [ ['carrrot', 3], ['banana', 2], ['apple', 1] ] 와 같이 정렬하고, 개수를 같이 표시해주는 식이다.
1. 최빈값(mode) 구하기
함수의 파라미터로 배열을 넣어 호출하면, 개수가 가장 많은 요소를 반환한다.
<구현 코드>
function getMode(array){
// 1. 출연 빈도 구하기
const counts = array.reduce((pv, cv)=>{
pv[cv] = (pv[cv] || 0) + 1;
return pv;
}, {});
// 2. 최빈값 구하기
const keys = Object.keys(counts);
let mode = keys[0];
keys.forEach((val, idx)=>{
if(counts[val] > counts[mode]){
mode = val;
}
});
return mode;
}
<사용 예시>
// 1. 문자열(단어)
const strings = ['a', 'b', 'b', 'c','c','c', 'd', 'd', 'd', 'd'];
getMode(strings); // d
// 2. 숫자
const numbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4];
getMode(numbers); // 4
// 3. 문자열(단어) + 숫자
const mix = [2, 2, 3, 3, 3, 'a', 'b', 'b'];
getMode(mix); // 3
<작동 원리>
1. 배열의 각 요소들의 출현 빈도를 구하고,
2. 출현 빈도가 가장 높은 요소를 반환한다.
(참고) 배열의 각 요소별 출현 빈도 구하는 방법에 대한 글
[Javascript]배열 문자열/숫자 요소 중복제거, 출현횟수(개수) 구하는 방법
근데 이 함수는 최빈값이 여러개인 경우, 하나만 반환하기 때문에 아쉬운 부분이 있을 수 있다.
그래서 아래의 출현 횟수별 정렬 함수를 만들었다.
2. 출현 빈도순 정렬하기
: 함수의 매개변수로 배열을 넣어 호출하면, 개수가 가장 많은 순으로 요소들을 정렬하여 반환한다.(출현 횟수 포함)
<구현 코드>
function getSortedArr(array) {
// 1. 출연 빈도 구하기
const counts = array.reduce((pv, cv)=>{
pv[cv] = (pv[cv] || 0) + 1;
return pv;
}, {});
// 2. 요소와 개수를 표현하는 배열 생성 => [ [요소: 개수], [요소: 개수], ...]
const result = [];
for (let key in counts) {
result.push([key, counts[key]]);
}
// 3. 출현 빈도별 정리하기
result.sort((first, second) => {
// 정렬 순서 바꾸려면 return first[1] - second[1];
return second[1] - first[1];
});
return result;
}
<사용 예시>
// 1. 문자열(단어)
const strings = ['a', 'b', 'b', 'c','c','c', 'd', 'd', 'd', 'd'];
getSortedArr(strings);
// [ [ 'd', 4 ], [ 'c', 3 ], [ 'b', 2 ], [ 'a', 1 ] ]
// 2. 숫자
const numbers = [1, 2, 2, 3, 3, 3, 4, 4, 4, 4];
console.log(getSortedArr(numbers));
// [ [ '4', 4 ], [ '3', 3 ], [ '2', 2 ], [ '1', 1 ] ]
// 3. 문자열(단어) + 숫자
const mix = [2, 2, 3, 3, 3, 'a', 'b', 'b'];
console.log(getSortedArr(mix));
// [ [ '3', 3 ], [ '2', 2 ], [ 'b', 2 ], [ 'a', 1 ] ]
3번째 예시처럼, 출현빈도가 같은 '2' 와 'b'를 모두 포함하여 정렬한다.
<작동 원리>
1. 요소별 개수를 파악하고,
2. [각요소, 개수] 를 요소로 하는 배열을 만들고,
3. Array.prototype.sort 메서드로 정렬한다.
참고로 sort메서드는 원본 배열을 정렬시키는데,
1) 콜백함수의 리턴값이 +이면 첫번째 인수를 우선 정렬하고,
2) 콜백함수의 리턴값이 -이면 두번째 인수를 우선 정렬한다.
3) 0이면 정렬 안하고그냥 둔다
그래서 오름차순, 내림차순의 정렬순서를 바꾸려면
return second[1] - first[1]; 부분을
return first[1] - second[1]; 로 수정해주면 된다.
필자가 개발중인 프로젝트에 필요해서 이것 저것 참조해서 급하게 만든 것이므로,
각자의 입맛에 맞게 수정/응용해서 사용하면 좋을듯 하다.
도움이 되셨길.
'개발(Development) > JS(자바스크립트)' 카테고리의 다른 글
[자바스크립트] 삼항 조건 연산자, 옵셔널체이닝 연산자, null병합 연산자: 변수, 객체, 값의 null 체크 검사 방법 (0) | 2021.03.09 |
---|---|
[자바스크립트] 정규표현식(Regular Expression) 기초/기본 쉽고 상세한 사용 방법 정리(샘플 예제 코드) (8) | 2021.03.08 |
[Javascript]배열 문자열/숫자 요소 중복제거, 출현횟수(개수) 구하는 방법 (0) | 2021.02.02 |
[Node.js] javascript로 python 연동 호출 오류: Module Not Found Error (0) | 2021.01.29 |
[Node.js] 자바스크립트로 파이썬 연동 실행 방법(함수 매개변수 전달 호출 : child-process) (6) | 2021.01.27 |
댓글