Filter, Map, Reduce 이용하기!

최정석·2022년 5월 24일
1

🚀 오늘 어려웠던 문제 🚀

배열을 입력받아 배열에서 가장 짧은 길이를 가진 문자열 요소를 리턴해야 합니다.
(반복문 사용은 금지, 같은 길이의 요소가 있다면 앞쪽 요소 리턴)

function findShortestWord(arr) {
  // TODO: 여기에 코드를 작성합니다.
  //[4, 'two', 2, 'three'] -> 'two'

  let filteredNum = arr.filter(function(el){
    return typeof el === 'string'; 
    //filter를 이용해서 타입이 문자열인 배열을 새로 만든다.
  })

  if(filteredNum.length === 0){
  //빈 배열인 경우 빈 문자열 리턴한다.
    return '';
  }
  
  return filteredNum.reduce(function(acc, cur){
  //reduce를 이용해서 누적 값과 현재 값의 길이 비교 후 더 작은 값의 문자열 리턴 
         if(acc.length <= cur.length){
           return acc
         } else {
           return cur
         }
  });

2차원 배열(배열을 요소로 갖는 배열)을 입력받아 모든 수(number)의 합을 리턴해야 합니다.

function sumOfArraysInArray(arr) {
  //[[],[],[]] -> []
  //reduce 와 concat을 활용하여 1차원 배열로 새롭게 만든다.
  //타입이 숫자인 요소만으로 새 배열을 만든다.
  //reduce로 숫자들을 합한다.
  
  let oneD = arr.reduce(function (acc, cur){
    return acc.concat(cur);    //1차원 배열 만들기
  });

  let filteredNumber = oneD.filter(function(el){
    return typeof el === 'number' //타입이 숫자인 요소만 갖는 배열 만들기
  });

  return filteredNumber.reduce(function(acc, cur){
    return acc + cur; //걸러진 숫자요소 다 더하기
  },0); //걸러진 배열이 빈 배열일 수 있으므로 초기값을 0으로 설정
  		//빈 배열인경우 0을 리턴

오늘의 회고

위에 문제들이 어려웠던 이유는 reduce에 대한 정확한 이해 부족이었다.
누적값 현재값 초기값이라는 키워드들이 정확하게 어떻게 서로 작용하는지
누적값과 현재값은 어떻게 변해가는지 등 깊게 이해하지 않고 넘어갔다.

filter와 map은 직관적인 상상으로 이해가 쉬웠는데
reduce도 그런식으로 이해하려해서 많이 어려웠다.

많은 동기들 또한 reduce에대해 나와 같은 어려움을 느꼈다.
줌세션에서 교육엔지니어님은 그림으로 천천히 설명하셨고
나는 그 때 정말 머리에 전구가 켜지듯 '아!💡' 라는 생각이 들며
순식간에 이해 됐다.

처음에 reduce를 학습할 때 너무 쉽게만 생각하려 했던 것 같다.
'요소들을 반복문처럼 순차적으로 함수를 실행시키는 구나'
라는 안일한 생각만으로 넘어간 나를 반성한다..

그래도 이제는 이해를 확실히 해서 reduce를 다시 사용할 땐 완벽한 사용을 할 수 있을 것 같은 자신감이 생겼다.

오늘은 32문제 정도를 풀었다. 나에겐 이또한 큰 산이지만 어찌어찌 잘 넘은 것 같다. 물론 앞으론 보다 더 큰 산들이 있겠지만 지난 한달과 오늘처럼 어찌어찌 잘 넘을 것이다.

혹시 저의 블로깅에 오류가 있다면 댓글 부탁드립니다! 학습에 큰 도움이 됩니다 🥰

0개의 댓글