고차함수 reduce 다루기, studentReports

2021. 8. 18. 23:52
반응형

문제 : 학생의 정보가 담긴 객체를 요소로 갖는 배열을 입력받아 아래 조건에 맞게 변형된 배열을 리턴해야 합니다.

1. 남학생들의 정보는 리턴하는 배열에서 제외합니다.

2. 'grades' 속성값은 평균값(number 타입)으로 바꿉니다.

주의사항 : 반복문 사용금지. 배열을 리턴해야 합니다. 배열로 되어 있는 학생들의 성적을 number 타입의 평균값으로 변형해야 합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function studentReports(students) {
  // 일단 여자만 필터
  let onlyGirls = students.filter((el) => {
    return el.gender === 'female';
  })
  //students배열의 객체요소들 안에있는 grades 배열을 평균값으로 바꿔주자!!
  return onlyGirls.map((el)=> { // 우선 배열안의 모든 요소에 적용해야 하니까 map사용
    let sum = el.grades.reduce((acc, cur)=>// grades속성의 배열에 있는 수를 모두 더해서 sum에 할당!!
      return acc + cur
    })
    let average = sum / el.grades.length // 평균을 구해서
    el.grades = average // 객체안의 grades 속성값이 배열이 였던것을 평균값으로 바꿔주고
    return el; // 리턴을 해준다. el 객체요소가 배열에 담겨서 리턴된다.
  })
}
cs

배열 메소드이자 고차함수 reduce를 활용한 문제이다. reduce 원리에 대해서 이해하고있지 못한다면 어려울 것이다. 배열 메소드 filter, map, reduce 중에서 나는 reduce가 가장 어렵다. 활용을 어떻게 하냐에 따라 다양한 일을 할 수 있기 때문에 어려운 것 같다. 이미 작성되어있는 것을 보면 이해가 되는데, 내가 어떤 문제를 해결하기 위해서 reduce 함수를 이렇게 써야겠다라는 생각은 잘 안든다. 어찌됐든 위 문제를 보면 배열 안에 여학생들의 자료 중에서 grades속성을 바꿔주는 문제이다. 여기서 grades 값은 배열인데 이 배열안의 수를 모두 더해서 평균값으로 바꿔줘야 한다. 즉, 배열에서 숫자로 바꿔줘야 한다. 이 문제를 해결하기 위해서는 나눠서 생각하는 게 좋다. 그래서 우선 여학생들만 있는 자료로 필터링을 해주고, 남은 자료 중에서 grades 속성 모두를 바꿔 주어야 하니까 map으로 접근한다. 그리고 그 안에서 바로 reduce를 리턴하는게 아니라 평균을 구하기 위한 방법으로 reduce 함수를 사용해서 평균 값을 구하고, map 함수를 이용해서 grades 속성을 바꿔주면 문제가 해결된다.

반응형
LIST

BELATED ARTICLES

more