자바스크립트에서 배열에 담긴 요소들이 정해진 횟수를 초과하여 반복되는지 확인하는 방법을 알아보겠습니다. 이를 위해 다음 두 가지 인자를 받는 함수를 작성합니다.
- 배열(arr): 반복되는 요소를 포함할 수 있는 리터럴 값들의 배열
- 숫자(limit): 각 요소가 허용되는 최대 반복 횟수
함수는 배열 내 어떤 요소도 limit으로 지정한 횟수보다 많이 반복되지 않는지 검증합니다. 만약 하나라도 limit을 초과하는 요소가 있다면 false를 반환하고, 모든 요소가 기준을 충족하면 true를 반환합니다.
구현 아이디어
핵심 로직은 다음과 같습니다.
reduce()를 사용해 배열을 순회하면서 각 요소의 등장 횟수를 객체 형태로 집계합니다.Object.values()로 집계된 횟수 값들만 추출한 뒤,every()메서드로 모든 횟수가 limit 미만인지 확인합니다.
예제 코드
const arr = [4, 6, 7, 4, 2, 5, 7, 7, 4, 4, 3];
const validateElements = (arr, n) => {
const counts = arr.reduce((acc, el) => {
acc[el] = (acc[el] + 1) || 1;
return acc;
}, {});
return Object.values(counts).every(c => {
return c < n;
});
};
console.log(validateElements(arr, 3));
console.log(validateElements(arr, 4));
console.log(validateElements(arr, 6));코드 설명
위 코드에서 reduce()는 배열을 순회하며 객체 acc에 각 요소를 키로 저장하고 등장할 때마다 카운트를 1씩 증가시킵니다. 이후 every()는 모든 카운트 값이 n(limit)보다 작은지 검사하므로, 하나라도 조건을 벗어나면 즉시 false가 반환됩니다.
출력 결과
콘솔에는 다음과 같은 결과가 출력됩니다.
false false true
결과 해석
- limit이 3일 때: 숫자 4가 총 4번 등장하므로
false - limit이 4일 때: 숫자 7이 총 3번, 4가 4번 등장하지만 7의 경우 문제가 없으나 실제로는 조건 비교가
c < n(미만)이므로 4번 등장한 4가 통과되지 못해false - limit이 6일 때: 모든 요소가 6회 미만으로 등장하므로
true
이처럼 reduce()와 every()를 조합하면 별도의 반복문 없이 간결하게 배열 요소의 중복 횟수를 검증할 수 있습니다.