reduce
함수는 JavaScript 배열에서 강력하고 유용한 고차 함수로, 배열의 모든 요소를 단일 값으로 결합하는 데 사용됩니다. 이를 통해 배열을 순회하며 누적 값을 생성할 수 있으며, 다양한 용도로 활용할 수 있습니다. 특히 숫자 합계, 객체 생성, 배열 병합 등의 작업에 매우 유용합니다.
1. reduce
함수의 기본 구조
reduce
함수는 두 개의 인수를 받습니다:
- 콜백 함수: 배열의 각 요소에 대해 실행될 함수
- 초기 값: 선택 사항으로, 누적 값의 초기 값을 설정합니다
콜백 함수는 다음 네 개의 인수를 받습니다:
- 누적 값(accumulator): 이전 함수 호출에서 반환된 값입니다.
- 현재 값(currentValue): 현재 배열 요소입니다.
- 현재 인덱스(index) (선택 사항): 현재 배열 요소의 인덱스입니다.
- 배열(array) (선택 사항):
reduce
를 호출한 배열 자체입니다.
const result = array.reduce((accumulator, currentValue, index, array) => {
// 콜백 함수 내용
}, 초기값);
2. reduce
함수의 작동 방식
배열의 첫 번째 요소부터 마지막 요소까지 차례대로 콜백 함수가 호출되며, 매 호출마다 누적 값이 갱신됩니다. 초기 값이 제공되면 첫 번째 요소와 함께 콜백 함수가 실행되고, 그렇지 않으면 배열의 첫 번째 요소가 초기 값이 됩니다.
3. 예제 1: 배열의 합 계산
가장 흔히 사용하는 예로, 배열의 모든 숫자의 합계를 계산하는 경우를 들 수 있습니다.
const numbers = [1, 2, 3, 4, 5];
const sum = numbers.reduce((acc, curr) => acc + curr, 0);
console.log(sum); // 출력: 15
이 예제에서 reduce
는 초기 값을 0
으로 설정하고 배열의 각 요소를 순차적으로 더하여 결과 값을 반환합니다.
4. 예제 2: 배열의 최대값 찾기
배열에서 최대값을 찾는 것도 reduce
로 쉽게 구현할 수 있습니다.
const numbers = [1, 2, 3, 4, 5];
const max = numbers.reduce(
(acc, curr) => (acc > curr ? acc : curr),
numbers[0]
);
console.log(max); // 출력: 5
이 예제에서는 누적 값과 현재 값을 비교하여 더 큰 값을 반환합니다. 초기 값은 배열의 첫 번째 요소로 설정되었습니다.
5. 예제 3: 객체 배열에서 속성 값 합계 구하기
객체 배열에서 특정 속성의 합계를 구하는 작업도 가능합니다. 예를 들어, 사람들의 나이 합계를 구하는 경우를 살펴봅시다.
const people = [
{ name: "John", age: 30 },
{ name: "Jane", age: 25 },
{ name: "Jack", age: 35 },
];
const totalAge = people.reduce((acc, person) => acc + person.age, 0);
console.log(totalAge); // 출력: 90
이 예제에서는 객체 배열에서 각 객체의 age
속성 값을 누적하여 합계를 계산했습니다.
6. 예제 4: 중첩 배열 평탄화
reduce
는 중첩된 배열을 평탄화(즉, 단일 배열로 변환)하는 데에도 유용하게 사용됩니다.
const nestedArray = [
[1, 2],
[3, 4],
[5, 6],
];
const flatArray = nestedArray.reduce((acc, curr) => acc.concat(curr), []);
console.log(flatArray); // 출력: [1, 2, 3, 4, 5, 6]
이 예제에서는 각 배열을 순회하며 concat
함수를 사용해 배열을 결합하여 평탄화된 단일 배열을 만들었습니다.
7. 예제 5: 객체로 배열 구성하기
배열을 객체로 변환하여 특정 값에 따라 그룹화하는 작업도 가능합니다. 예를 들어, 사람들을 나이별로 그룹화하는 경우를 생각해봅시다.
const people = [
{ name: "John", age: 30 },
{ name: "Jane", age: 25 },
{ name: "Jack", age: 30 },
{ name: "Jill", age: 25 },
];
const groupedByAge = people.reduce((acc, person) => {
const key = person.age;
if (!acc[key]) {
acc[key] = [];
}
acc[key].push(person.name);
return acc;
}, {});
console.log(groupedByAge);
// 출력: { '25': ['Jane', 'Jill'], '30': ['John', 'Jack'] }
이 예제에서는 age
를 키로 사용하여 사람들의 이름을 배열로 저장한 객체를 만들었습니다.
8. reduce
의 장점과 주의사항
- 장점:
reduce
는 배열의 모든 요소를 단일 값으로 결합하는 강력한 기능을 제공합니다. 배열의 합계 계산, 중첩 배열 평탄화, 객체 변환 등 여러 작업을 간단하게 처리할 수 있습니다. - 주의사항:
reduce
를 사용할 때는 코드의 가독성을 주의해야 합니다. 복잡한 작업을reduce
로 처리할 경우 코드가 이해하기 어려울 수 있습니다. 이럴 때는 적절한 주석을 달거나, 복잡한 로직은 별도의 함수로 분리하는 것이 좋습니다.
9. 결론
JavaScript의 reduce
함수는 다양한 방식으로 배열을 처리할 수 있는 매우 강력한 도구입니다. 배열의 요소를 누적하여 단일 값으로 축소하는 기능은 다양한 상황에서 유용하게 활용될 수 있습니다. 다만, reduce
가 모든 문제를 해결하는 만능 도구는 아니므로, 상황에 맞게 적절히 사용하는 것이 중요합니다.
'JavaScript & TypeScript' 카테고리의 다른 글
싱글톤 패턴 이해하기: 리소스 관리부터 테스트 개선까지 (4) | 2024.10.08 |
---|---|
JavaScript의 내장 함수 - some() (0) | 2024.10.08 |
JavaScript의 내장 함수 - filter() (0) | 2024.10.07 |
JavaScript의 내장 함수 - map (0) | 2024.10.05 |
JavaScript - join() 함수 소개 (0) | 2024.10.04 |