JS 고차함수

SuJin·2022년 9월 20일
0

JavaScript

목록 보기
4/7

고차함수

두 개의 함수를 입력받아 두 함수가 결합된 새로운 함수를 리턴해야 합니다.

function compose2(func1, func2) {
  return function (num){
    return func1(func2(num));
  }
}

함수들을 입력받아 함수들이 입력된 차례대로 결합된 새로운 함수 리턴

function pipe(...funcs) {
  return function (num){
    let result = num;
    for(let i = 0; i < funcs.length; i++){
      result = funcs[i](result);
    }
    return result;
  }
}

내장 고차 함수

filter 메서드

배열과 임의값(discarder)을 입력받아 기존 배열에서 discarder와 일치하는 요소가 제거된 새로운 배열을 리턴해야 한다.

 function removeElement(arr, discarder) {
   return arr.filter(function (el) {
     if(el !== discarder){
       return true
     }
     else{
       return false;
     }
   })
 }

객체와 키를 입력받아 키에 해당하는 값이 배열인 경우, 100보다 작은 요소들만 갖는 배열을 리턴해야한다.

 function lessThan100(number) {
   return  number < 100;
 }
 
 function getElementsLessThan100AtProperty(obj, property) {
     let arr = obj[property];
   if(Array.isArray(arr)){
     return arr.filter(function (el){
       if(typeof(el) === 'number'){
         return lessThan100(el);
       }
     })
   }
   else{
     return [];
   }
 }
 
 --------------------------------------------------------------------------
 function lessThan100(number) {
   return typeof(number) === 'number' && number < 100;
 }
 
 function getElementsLessThan100AtProperty(obj, property) {
   let arr = obj[property];
   if(Array.isArray(arr)){
 		return arr.filter(lessThan100);
   }
   else{
     return [];
   }
 }

Map

// 만화책 모음
const cartoons = [
  {
    id: 1,
    bookType: 'cartoon',
    title: '식객',
    subtitle: '어머니의 쌀',
    createdAt: '2003-09-09',
    genre: '요리',
    artist: '허영만',
    averageScore: 9.66,
  },
  {
    id: 2,
    // ..
  },
  // ...
]; 

// 만화책 한 권의 부제를 리턴하는 로직(함수)
const findSubtitle = function (cartoon) {
  return cartoon.subtitle;
}; 

// 각 책의 부제 모음 
const subtitles = cartoons.map(findSubtitle); // ['어머니의 쌀', ...]

오답노트

객체와 키를 입력받아 18세 이상인 사람의 이름을 요소로 갖는 배열을 리턴

function getOnlyAllowedToDrink(arr) {
  const list = arr.filter(function(el){
    return el.age >= 18
  })

  return list.map(function(el){
    return el.name;
  })
}

Reduce

function computeSumOfAllElements(arr) {
  if (arr.length === 0) return 0
  return arr.reduce(function(acc, val){
    return acc + val;
  })
}

let output = computeSumOfAllElements([1, 2, 3]);
console.log(output); // --> 6

오답노트

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

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

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

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

2차원 배열을 다 합쳐서 단일 배열로 리턴하기

function joinArrayOfArrays(arr) {
  return arr.reduce(function(acc, cur){
    return acc.concat(cur)
  })  
}

추상화

오답노트

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

  1. 남학생 정보 제외
  2. grades 속성값은 평균값(number 타입으로 바꿈)
function studentReports(students) {
  const stu = students.filter(function(el){
    if(el.gender === 'female'){
      return el;
    }
  })

  return stu.map(function(el){
    const sum = el.grades.reduce(function(acc,cur){
      return acc + cur;
    })
    const avg = sum / el.grades.length

    el.grades = avg;
    return el;
  })
}
profile
Anyone can be anything.

0개의 댓글