Computer >> 컴퓨터 >  >> 프로그래밍 >> JavaScript

JavaScript reduce()로 배열을 양수와 음수로 분리하는 방법

JavaScript에서 하나의 배열을 받아 양수 배열음수 배열을 각각 담고 있는 객체를 반환하는 함수를 작성해야 하는 경우가 있습니다. 예를 들어, 숫자들이 섞여 있는 배열이 주어졌을 때 양수만 모은 배열과 음수만 모은 배열로 깔끔하게 나누는 것이죠.

이 작업은 Array.prototype.reduce() 메서드를 활용하면 간단하게 해결할 수 있습니다. reduce()는 배열의 각 요소를 순회하면서 누적값(accumulator)을 반환하기 때문에, 순회 과정에서 조건에 맞는 요소들을 객체 내 두 개의 배열에 담아두기에 적합합니다.

구현 코드

먼저 초기 누적값으로 positivenegative라는 빈 배열을 가진 객체를 설정하고, 순회하면서 각 요소의 부호를 판별해 해당 배열에 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()를 두 번 사용하는 방법보다 효율적이라는 장점도 있습니다.