12월 21일 복기

Ji Taek Lim·2020년 12월 21일

function getDomain(email) {
  return email.split('@')[1].split('.')[0];
}

function getUserId(email) {
  return email.split('@')[0];
}

let output = callbackOnly(getDomain, {
  status: 'success',
  data: 'mike@codestates.com',
});
console.log(output); // --> codestate

output = callbackOnly(getUserId, {
  status: 'success',
  data: 'mike@codestates.com',
});
console.log(output); // --> mike

output = callbackOnly(getUserId, {
  status: 'fail',
  data: 'mike@codestates.com',
});
console.log(output); // --> 'Something went wrong!'

function callbackOnly(callback, response) {
  if (response.status === 'success') {
    return callback(response.data)
  }

  else if (response.status === 'fail') {
    return 'Something went wrong!';
  }
}

function square(num) {
  return Math.pow(num, 2);
}

function mul10(num) {
  return num * 10;
}

let output = mapCallback(square, [2, 4, 7]);
console.log(output); // --> [4, 16, 49]

output = mapCallback(mul10, [2, 4, 7]);
console.log(output); // --> [20, 40, 70]

output = mapCallback(square, []);
console.log(output); // --> []

function mapCallback(func, arr) {
  let newArr=[];
  for (let i =0 ; i <arr.length ; i++) {
    newArr.push(func(arr[i]))
  }
  return newArr;
}

09_filterCallback

함수와 배열을 입력받아 배열의 각 요소에 함수를 적용했을 때 그 결과가 참인 요소만을 갖는 새로운 배열을 리턴해야 합니다.

function isOdd(num) {
  if (num % 2) {
    return true;
  } else {
    return false;
  }
}
filteredArray([1, 2, 3], isOdd); // [1, 3]

function filterCallback(func, arr) {
  let newArr =[];

  for(let i =0; i<arr.length ; i++) {
    if(func(arr[i])) {
      newArr.push(arr[i])
    }
  }
  return newArr;
}

Built-in higher order functions


// 아래 코드에서 '짝수'와 '길이 5 이하'는 문법 오류(syntax error)에 해당합니다.
// 의미만 이해하도록 합니다.
let arr = [1, 2, 3, 4];
let output = arr.filter(짝수);
console.log(output); // ->> [2, 4]

arr = ['hello', 'code', 'states', 'happy', 'hacking'];
output = arr.filter(길이 5 이하)
console.log(output); // ->> ['hello', 'code', 'happy']

// 아래 코드는 정확한 표현 방식은 아닙니다.
// 의미만 이해하도록 합니다.

let arr = [1, 2, 3];
// 배열의 filter 메소드는 함수를 인자로 받는 고차 함수입니다.
// arr.filter를 실행하면 내부적으로 arr에 접근할 수 있다고 생각해도 됩니다.
arr.filter = function (arr, func) {
  const newArr = [];
  for (let i = 0; i < arr.length; i++) {
    // filter에 인자로 전달된 콜백 함수는 arr의 각 요소를 전달받아 호출됩니다.
    // 콜백 함수가 true를 리턴하는 경우에만 새로운 배열에 추가됩니다.
    if (func(arr[i]) === true) {
      newArr.push(this[i]);
    }
  }
  // 콜백 함수의 결과가 true인 요소들만 저장된 배열을 리턴합니다.
  return newArr;
};

// 보다 정확한 정의
// Immersive 과정에서 프로토 타입과 this를 학습하신 후에
// 아래 코드를 이해하시기 바랍니다.
// Array.prototype.filter = function(func) {
//   const arr = this;
//   const newArr = []
//   for(let i = 0; i < arr.length; i++) {
//     if (func(arr[i]) === true) {
//       newArr.push(this[i])
//     }
//   }
//   return newArr;
// }

filter


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

const isCreatedAt2003 = function (cartoon) {
  const fullYear = new Date(cartoon.createdAt).getFullYear()
  return fullYear === 2003;
}; // 단행본 한 권의 출판판년도가 2003인지 확인하는 함수

const filteredCartoons = cartoons.filter(isCreatedAt2003); // 출판년도가 2003년인 책의 모음

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

const scoreReducer = function (sum, cartoon) {
  return sum + cartoon.averageScore;
}; // 단행본 한 권의 평점을 누적값에 더한다.

let initialValue = 0 // 숫자의 형태로 평점을 누적한다.
const cartoonsAvgScore = cartoons.reduce(scoreReducer, initialValue) / cartoons.length; 
// 모든 책의 평점을 누적한 평균을 구한다.

https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/Reduce


고차 함수에 대한 설명 중 바른 것을 모두 고르시오.

정답:
고차 함수와 콜백 함수는 각각 다른 의미를 가지고 있다.

고차 함수는 일급 객체이다.

설명:
A. 고차 함수는 함수이기 때문에 일급 객체입니다. "고차"라는 단어가 헷갈릴 수는 있지만, 일급 객체에서 벗어나지 않습니다.



B. 변수명으로 써도 되고, 그 자리에서 함수를 작성해도 됩니다.



예시 ) 

const foo = function(a) {

   return a;

};



function(foo); //이런 식으로 작성해도 되고,

function(function(a) { return a; }); //이렇게 작성해도 됩니다.



C. 고차 함수는 함수를 인자로 받거나 함수를 리턴하는 함수를 말하고, 콜백 함수는 함수의 인자로 전달되는 함수를 말합니다.



D. 고차 함수는 다른 함수를 인자로 받을 수 있고, 함수를 리턴할 수도 있습니다. 두 개 다 하는 것도 가능합니다.



E. 함수를 리턴할  ()를 붙인다면 실행이 되어 값으로 반환되기 때문에, ()를 빼고 써야 합니다.
profile
임지택입니다.

0개의 댓글