JavaScript에서 하나의 배열을 받아 양수 배열과 음수 배열을 각각 담고 있는 객체를 반환하는 함수를 작성해야 하는 경우가 있습니다. 예를 들어, 숫자들이 섞여 있는 배열이 주어졌을 때 양수만 모은 배열과 음수만 모은 배열로 깔끔하게 나누는 것이죠.
이 작업은 Array.prototype.reduce() 메서드를 활용하면 간단하게 해결할 수 있습니다. reduce()는 배열의 각 요소를 순회하면서 누적값(accumulator)을 반환하기 때문에, 순회 과정에서 조건에 맞는 요소들을 객체 내 두 개의 배열에 담아두기에 적합합니다.
구현 코드
먼저 초기 누적값으로 positive와 negative라는 빈 배열을 가진 객체를 설정하고, 순회하면서 각 요소의 부호를 판별해 해당 배열에 push하는 방식입니다.
const arr = [97, -108, 13, -12, 133, -887, 32, -15, 33, -77];
const splitArray = (arr) => {
return arr.reduce((acc, val) => {
if (val < 0) {
acc['negative'].push(val);
} else {
acc['positive'].push(val);
}
return acc;
}, {
positive: [],
negative: []
});
};
console.log(splitArray(arr));실행 결과
위 코드를 실행하면 콘솔에 다음과 같은 객체가 출력됩니다.
{
positive: [97, 13, 133, 32, 33],
negative: [-108, -12, -887, -15, -77]
}코드 설명
reduce()의 두 번째 인자로 전달한 { positive: [], negative: [] } 객체가 초기 누적값 역할을 합니다. 콜백 함수는 배열의 각 요소(val)를 검사하여 0보다 작으면 negative 배열에, 그렇지 않으면 positive 배열에 추가한 뒤 누적 객체를 그대로 반환합니다. 모든 요소의 순회가 끝나면 최종적으로 두 배열을 포함한 객체가 반환됩니다.
참고로 이 방식은 원본 배열을 변경하지 않으며(불변성 유지), 배열을 한 번만 순회하므로 시간 복잡도는 O(n)입니다. filter()를 두 번 사용하는 방법보다 효율적이라는 장점도 있습니다.