중첩된 배열에서 Reduce 사용하여 평균 구하기

방충림·2023년 4월 21일
4

JavaScript

목록 보기
4/4
post-thumbnail

보통 어떠한 배열의 평균을 구하는 로직은 다음과 같다.
인자로 배열을 받고, 해당 배열은 숫자 타입의 요소만을 가지고 있다고 가정한다.

 const getAverage = (arr) => {
 const sum = arr.reduce((acc, cur) => acc + cur);
 const avg = sum / arr.length;
 return avg;
 };

acc에 배열의 요소들을 하나씩 저장하면서 나아갈 것이다.

그런데 만약 인자로 주는 배열안의 요소가 또 배열이고, 난 그 요소 배열의 두번째 요소들의 평균을 구하고 싶다면 어떨까?

예를들어 다음과 같이 되어있다고 생각해보자.

const arr = [["강낭콩",1].["완두콩",2].["검은콩",3].["대두콩",4].["팥",5]]

콩의 이름들은 필요없다. 두번째 요소인 정수타입의 수들의 평균을 구하고 싶다.
아래와 같이 하면 될까?

 const getAverage = (arr) => {
    const sum = arr.reduce((acc, cur) => acc + cur[1]);
    const avg = sum / arr.length;
    return avg;
  };

아쉽지만 출력해보면 결과는 NaN가 나올 것이다.
왜 그럴까?

그것은 reduce 메서드의 초기값과 관련이 있다.
reduce메서드는 두번째인자로 초기값을 넣어 줄 수 있다.
하지만 이 값은 옵션이다. 즉 넣지 않아도 되는데, 그렇게되면 배열의 첫번째 요소를 acc의 초기값으로 넣고 두번째 요소부터 더해나가게 된다.

자 그러면 왜 NaN가 나왔겠는가?

배열의 첫째요소인 ["강낭콩",1]정수를 더하려 했기 때문이다.
따라서 여기에서 원하는 결과를 얻기위해서는 두번째 인자로 초기값 0을 주어서 배열이 들어오지 않도록 하면 된다.

const getAverage = (arr) => {
    const sum = arr.reduce((acc, cur) => acc + cur[1], 0);
    const avg = sum / arr.length;
    return avg;
  };
profile
최선이 반복되면 최고가 된다.

0개의 댓글