[SEB FE] section 2 unit 1 (3) 고차 함수 풀이 25~32

동화·2022년 10월 6일
0

코드스테이츠

목록 보기
15/32



25.

숫자 배열 요소들의 평균

function computeAverageOfNumbers(arr) {
  if (arr.length === 0) return 0
  let sum = arr.reduce((acc, cur) => acc + cur)
  return sum / arr.length
}




26.

객체를 요소로 갖는 배열과 문자열을 입력받아 각 요소의 'animal' 속성값이 문자열과 일치할 경우, 해당 요소의 'score' 속성값을 모두 더한 값을 리턴해야 합니다.

❌ 실패 코드 ❌

function calculateScore(records, value) {
  let equals = records.filter(function(el){
    if (el === value) return true
  })

  return equals.reduce((acc, cur) => acc.score + cur.score)  
}

필터를 이용해서 value와 el이 같을 때를 걸러내고, 그 배열의 합을 구했다고 생각했는데.. 암튼 답이 안나왔다.

계속 빈배열을 출력하는 결과가 나옴


⭕️ 성공

function calculateScore(records, value) {
  let sum = records.reduce(function(acc, obj){
    if (value === obj.animal) {
      return acc + obj.score
    } else {
      return acc
    }
  }, 0);
  return sum;
}

acc 에다가 더한다는게 아직 명확히 이해는 가지 않음.. 그리고 0) 뒤나 sum뒤에 ; 쓰지 않았을 때 코드에 오류가 생겼다

// acc는 콜백의 반환값을 계속 계속 누적하는 것..


```js function calculateScore(records, value) { const sum = records.reduce((acc, obj) => value === obj.animal ? acc + obj.score : acc, 0) return sum; } ``` 삼항연산자를 이용해서 줄였다.

초깃값을 설정해주지 않았더니 대부분 통과하지 못했음. 저 뒤에도 초깃값으 설정해 줄 수 있었고, 꼭 해주어야했따!





27.

문자열을 요소로 갖는 배열을 입력받아 배열에서 가장 긴 문자열을 리턴해야 합니다.

function getLongestElement(arr) {
  if (arr.length === 0) {return ''}
  let result = arr.reduce(function(i, j){
    if (i.length >= j.length){
      return i
    } else {
      return j
    }
  })
  return result
}

처음에 직관적으로 적었던 코드. 물론 전부 통과는 했다
빈배열일 떄의 출력값을 따로 적어주고, reduce 함수를 이용해서 앞 문자열, 뒷 문자열 비교해 출력


function getLongestElement(arr) {
  let result = arr.reduce((i, j) =>
    i.length >= j.length ? i : j, '')
  return result
}

두 번째 코드. 빈 배열의 출력값을 따로 적어주지 않고 초깃값을 '' 로 설정했다.
왜 초깃값이 '' 이면 빈 배열일 때 빈 문자열을 입력해주는 가..

function getLongestElement(arr) {
  return arr.reduce((i, j) => i.length >= j.length ? i : j, '')
}

근데 꼭 결괏값을 변수로 지정할 필요가 없잖아? 해서 바로 리턴으로 빼냈다





28.

문자열을 요소로 갖는 배열을 입력받아 배열에서 가장 긴 문자열의 길이를 리턴해야 합니다.

❌ 실패 코드 ❌

function getLengthOfLongestElement(arr) {
  let result = arr.reduce((acc, cur) =>
  acc.length >= cur.length ? acc.length : cur.length, 0)
  return result
}

첫 번째 거는 클리어했는데,
이상하게도 두 번째 거를 통과하지 못하고 2를 출력했다
왜 2를 출력했을까.. 의문 ㅠㅠ...

레퍼런스 📌

function getLengthOfLongestElement(arr) {
  if (arr.length === 0) {
    return 0;
  }

  return arr.reduce(function (acc, cur) {
    if (acc.length >= cur.length) {
      return acc;
    } else {
      return cur;
    }
  }).length;
}




29.

2차원 배열(배열을 요소로 갖는 배열)을 입력받아 배열들의 요소를 모두 담고 있는 단일 배열을 리턴해야 합니다.

function joinArrayOfArrays(arr) {
    let join = arr.reduce(function(a,b){
      return a.concat(b)
    })
    return join
}

concat 함수 이용.


function joinArrayOfArrays(arr) {
  return arr.reduce((a,b) => a.concat(b))
}





30.

배열을 입력받아 배열에서 가장 짧은 길이를 가진 문자열 요소를 리턴해야 합니다.

function findShortestWord(arr) {
  let stringFilter = arr.filter (el => typeof el === 'string')
  if (!stringFilter.length) return ''
  return stringFilter.reduce ((acc,cur) =>
    acc.length <= cur.length ? acc : cur)     
}

상당한 시행착오를 겪은 문제이다.
일일이 여기다가 적지는 않았지만, 처음엔 바보같이 문제 이해도 못하고 배열들을 냅다까라 비교했고
나중에는 아 이거저거 섞여있으니까 filter로 걸러내어야겠다 생각했다.
그리고 이 문제는 또 초깃값으로는 빈 배열을 출력하지 못 하였고.. (대체 이유가 무엇인가..)
따로 배열의 길이가 존재하지 않는다면.. 빈 배열을 출력하라고 설정해놨다





31.

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

  • 남학생들의 정보는 리턴하는 배열에서 제외합니다.
  • 'grades' 속성값은 평균값(number 타입)으로 바꿉니다.

❌ 왕👑 실패 코드 ❌

function studentReports(students) {
  let result = [];
  let femaleInfo = students.filter(el => el.gender === 'female')
  femaleInfo.reduce((acc, cur) => acc + cur.grades)

  return result
}

❌ 실패 코드 2 ❌

function studentReports(students) {
  let femaleInfo = students.filter(el => el.gender === 'female')
  
  femaleInfo.map (function (el) {
    let sum = el.grades.reduce (acc, cur => acc + cur, 0)
    })
    let final = sum / el.grades.length;

  return final
}

❌ 실패 코드 3 ❌ - 도저히 못하거따...

function studentReports(students) {
  let femaleInfo = students.filter(el => el.gender === 'female')
  
  femaleInfo.map (function (el) {
    let sum = el.grades.reduce (acc, cur => acc + cur, 0)
    })
    let final = sum / el.grades.length;

    el.grades = final
    return el
}



⭕️ 답

function studentReports(students) {
  const femaleInfo = students.filter(el => el.gender === 'female')
  
  return femaleInfo.map (function (el) {
    const sum = el.grades.reduce (function(acc, cur) {
        return acc + cur
    }, 0);
    const final = sum / el.grades.length;

    el.grades = final;
    return el
  });
}

거의 레퍼런스 코드 보고 풀었다고 해도 무방한데..
map 옆에 return 이 안 쓰여져서 있어서 아무리 찾아도 방도를 찾지 못했다..
근데 왜 retrun 을 써주어야 하는가..?





32.

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

function sumOfArraysInArray(arr) {
  const total = arr.reduce((a,b) => a.concat(b))
  const onlyNum = total.filter(el => typeof el === 'number')
  return onlyNum.reduce((acc, cur) => acc + cur, 0)
}

처음에 'number'를 'Number'로 적고서 아무리봐도 레퍼런스랑 다른게 없어서
화살표 함수 다 지우고 function 입력했는데도 안 되길래 잘 비교해봤더니 그 부분이었음 ㅎ_ㅎ 삽질 그자체

0개의 댓글