JavaScript로 개발을 하다 보면 문자열 배열에서 가장 긴 단어와 가장 짧은 단어를 동시에 찾아야 하는 경우가 종종 있습니다. 이번 글에서는 Array.prototype.reduce() 메서드를 활용해 한 번의 순회만으로 두 값을 모두 구하는 방법을 알아보겠습니다.
문제 상황
다음과 같은 문자열 리터럴 배열이 있다고 가정해 보겠습니다.
const arr = ['Some', 'random', 'words', 'that', 'actually', 'form', 'a', 'sentence.'];
이 배열에서 가장 긴 단어와 가장 짧은 단어를 각각 반환하는 함수를 작성해야 합니다.
reduce()를 활용한 해결 방법
reduce() 메서드는 배열을 처음부터 끝까지 순회하면서 누적값(accumulator)을 유지할 수 있기 때문에 이 문제에 적합합니다. 초기 누적값으로 배열의 첫 번째 요소를 longest와 shortest에 모두 할당한 뒤, 각 요소의 길이를 비교하며 값을 갱신하는 방식입니다.
예제 코드
const arr = ['Some', 'random', 'words', 'that', 'actually', 'form', 'a',
'sentence.'];
const findWords = (arr) => {
return arr.reduce((acc, val) => {
const { length: len } = val;
if(len > acc['longest']['length']){
acc['longest'] = val;
}else if(len < acc['shortest']['length']){
acc['shortest'] = val;
};
return acc;
}, {
longest: arr[0],
shortest: arr[0]
});
};
console.log(findWords(arr));코드 설명
- 초기값 설정: reduce의 두 번째 인수로
{ longest: arr[0], shortest: arr[0] }객체를 전달하여 첫 번째 요소를 기준값으로 사용합니다. - 길이 비교: 현재 요소의 길이(
len)가 기존 longest보다 길면 longest를 교체하고, shortest보다 짧으면 shortest를 교체합니다. - 단일 순회: 조건이 else if로 연결되어 있어 한 번의 반복 안에서 두 값이 모두 효율적으로 갱신됩니다.
실행 결과
콘솔에 출력되는 결과는 다음과 같습니다.
{ longest: 'sentence.', shortest: 'a' }배열에서 가장 긴 단어는 'sentence.'(9자)이고, 가장 짧은 단어는 'a'(1자)임을 확인할 수 있습니다. 이처럼 reduce()를 활용하면 별도의 정렬이나 여러 번의 반복 없이 깔끔하게 원하는 결과를 얻을 수 있습니다.