문제 3

모모·2021년 10월 31일
0

문제 복기

목록 보기
3/5

문제

객체가 담긴 요소를 갖는 배열을 입력받는다.
이때, 성별이 남성인 회원의 평균 운동시간을 확인할 수 있는 배열을 리턴해라
객체는 gender, time 속성을 가지며 time의 속성값은 일일 운동시간으로 구성된 배열이다.

// 임의의 배열 예시)
let memberExample = [
  {gender: 'man', time: [1, 2, 3]},
  {gender: 'woman', time: [1.5, 2.5, 2, 2]}
  ];
function gymMember(member) {
  // 남성만을 걸러준다 -> filter
  // 속성 time 값의 합을 구하고 이를 속성의 길이로 나누어 평균을 구한다
  	// 배열 모든 요소에 접근 -> map
  	  // time 값의 합을 구한다 -> reduce

  const onlyMan = members.filter(function(person){
    return person.gender === 'man'};
});

  return onlyMan.map(function(element){
    const sumTime = element.time.reduce(function(acc, cur){
      return acc + cur;}, 0);
    const avgTime = sumTime / element.time.length;
    element.time = avgTime;
	return element;
  });
}

풀이 과정에서의 생각

문제를 단순하게 만들기 위해 먼저 배열에서 남성만을 남긴 새로운 배열을 선언한다. filter를 사용하여 속성 gender의 값이 남성이면 반환한다.

여기에 map을 사용하여 각 요소(객체)에 접근한다. 이 상태에서 time의 평균을 구하기 위해 time의 합을 먼저 구하자. 편의를 위해 time의 합을 구하는 변수를 선언한 뒤, reduce 함수로 더하는 작업을 실행한다.

time 합을 구해준 뒤에는 다시 map 함수로 빠져나온다. 그리고 time의 합을 각 요소의 time 속성의 길이만큼 나눠주어 평균을 구한다.

issue

처음에는 filter와 reduce만을 사용해 문제를 해결하려했다.
남성만을 걸러내는 작업은 수월했다. 하지만, 합과 평균을 구하기 위해 요소중에서도 time에 접근하는 것이 난해했다. 리턴하는 함수의 파라미터에는 배열을 넣지만 reduce를 실행하는 함수의 파라미터 둘은 요소의 값으로서 서로를 더해야 했기 때문이다. 즉, 중첩된 함수의 파라미터의 depth가 배열 ≠ 배열의 요소인 객체의 속성 값이 되어 제대로 작동하지 못했다.

이에 배열의 요소에 접근하는 map의 필요성을 느꼈고, map을 통해 배열 요소에 접근한 뒤, 요소인 속성 중에서 time에 접근하여 reduce로 합을 구할 수 있었다.

0개의 댓글