Home reduce()
Post
Cancel

reduce()

내일배움캠프 LGLG!

7주차(주특기 심화 - React)

reduce

  • 함수를 실행하고 하나의 결과값을 반환
  • reduce는 ‘줄이다’라는 뜻이며, ‘누산기’라고 이해하면 된다.

단순화된 형태

두 개의 인자를 갖는다

acc accumulator : 누산기, 누적되는 값, 최종적으로 출력되는 값
cur current : 현재 돌고 있는 요소

1
2
const numbers = [4, 3, 2, 1];
let sum = numbers.reduce((acc, cur) => acc + cur)

위를 풀어서보면 아래와 같다.

1
2
3
4
const numbers = [4, 3, 2, 1];
let sum = numbers.reduce((acc, cur) => {
  return acc + cur
});

더 풀어서보면 다음과 같다.

acc 에는 가장 첫 번째 원소인 ‘4’를 할당하고 (index 0) cur 에는 나머지 원소인 ‘3, 2, 1’이 순차적으로 들어간다. (index 1, 2 …)

1
2
3
4
acc += cur; // 4 += 3;
acc += cur; // 7 += 2;
acc += cur; // 9 += 1;
console.log(acc); // 10

옵션이 추가된 발전된 형태

2개의 인자 + 1개의 초기값

acc accumulator : 누산기, 누적되는 값, 최종적으로 출력되는 값
cur current : 현재 돌고 있는 요소
initialValue : acc의 초기값 (optional)

1
2
3
const numbers = [4, 3, 2, 1];
let sum = numbers.reduce((accumulator, current) => accmulator + current, 0);
console.log(sum);

acc의 초가값으로 initialValue를 할당하는 순간 cur는 index 1부터가 아니라 0부터 돌아간다.

같은 배열이지만 index 0의 주인이 달라진다.

1
2
3
4
5
acc += cur; // 0 += 4;
acc += cur; // 4 += 3;
acc += cur; // 7 += 2;
acc += cur; // 9 += 1;
console.log(acc); // 10

두 개의 인자를 추가

4개의 인자 +1개의 초기값

acc accumulator : 누산기, 누적되는 값, 최종적으로 출력되는 값
cur current : 현재 돌고 있는 요소
idx index : 배열 요소의 순서 (optional)
arr array (또는 src source) : 현재 배열, 원본 배열 (optional)
initialValue : acc의 초기값 (optional)

다음은 평균을 구하는 reduce 함수이다.

마지막에만 나누기를 위해서 index와 arr를 불러왔다.

헷갈려보이지만 주석에 표시된 순서대로 돌면 된다.

1
2
3
4
5
6
7
8
const avg = numbers.reduce((acc, cur, index, arr) => {
	if (index === arr.length - 1) { // index가 마지막일 때
		return (acc + cur) / arr.length; // cur - 4
	}
	return acc + cur; // cur - 1, 2, 3
	}, 0);

console.log("avg", avg);

응용편

각 알파벳의 개수를 구하는 reduce 함수

1
2
3
4
5
6
7
8
9
10
11
12
const alphabets = ["a", "a", "c", "c", "c"];
 
const cnt = alphabets.reduce((acc, cur) => {
 if (acc[cur]) {
   acc[cur] += 1;
 } else {
   acc[cur] = 1; // acc.cur이 없으면 선언함
 }
 return acc;
}, {}); // acc는 오브젝트로 선언
 
console.log(cnt); // {a: 2, c: 3}

1) 초기값으로 갑자기 빈 오브젝트를 할당하고 2) 오브젝트인데 배열처럼 불러오지 않나 3) if 구문은 어떻게 되는 것인지…

우선, 오브젝트의 프로퍼티(속성)를 불러오는 법을 알아야 한다.
obj["a"]obj.a은 동일하다.

1
2
3
4
// 오브젝트의 프로퍼티를 부르는 2가지 방법
const obj = { a: "hey", b: 0, c: 0 };
console.log(obj["a"]); // 'hey"
console.log(obj.a); // "hey"

if 구문 if (acc[cur])을 이해하려면 오브젝트의 프로퍼티 선언 방법을 봐야 한다.
acc[cur]undefined 인지 아닌지가 중요하다.
처음에는 당연히 빈 오브젝트가 초기값이다보니 undefined 가 된다.
그러면 else 구문에서 처음으로 프로퍼티가 선언되는 것이다.

1
2
3
4
5
6
7
8
9
10
//  프로퍼티 없을 경우
console.log(obj.j); // undefined
console.log(obj["k"]); // undefined
 
//  프로퍼티 선언
obj.j = 1; // 선언
console.log(obj.j); // 1
 
obj["k"] = 2; // 선언
console.log(obj["k"]); // 2

문제 풀이

배운 내용(배열 내장함수)을 바탕으로 3가지 방법으로 풀어보기

1
2
3
4
5
6
function countBiggerThanTen(numbers) {
 /** 문제 **/
}
  
const count = countBiggerThanTen([1, 2, 3, 5, 10, 20, 30, 40, 50, 60]);
console.log(count); // 5

1) 첫 번째 풀이법

1
2
3
4
5
6
7
8
9
function countBiggerThanTen(numbers) {
 return numbers.reduce((acc, cur) => {
   if (cur > 10) {
     return acc + 1;
   } else {
     return acc;
   }
 }, 0);
}

2) 두 번째 풀이법

1
2
3
function countBiggerThanTen(numbers) {
 return numbers.filter((el) => el > 10).length;
}

3) 세 번째 풀이법

1
2
3
4
5
6
7
function countBiggerThanTen(numbers) {
 let cnt = 0;
 numbers.forEach((element) => {
   if (element > 10) cnt++;
 });
 return cnt;
}
This post is licensed under CC BY 4.0 by the author.

최댓값 만들기 (1)

문자열 곱하기