고차함수

hyxoo·2023년 3월 15일
0

코드스테이츠

목록 보기
16/37
post-thumbnail

📝[Section2_Unit1] 고차 함수

📌고차 함수

고차 함수(higher order function)란 함수를 전달인자(argument)로 받을 수 있고, 함수를 리턴할 수 있는 함수를 말한다.

✔️ 콜백 함수(callback function) : 다른 함수(caller)의 전달인자(argument)로 전달되는 함수를 의미한다.
✔️ 커링 함수 : 함수를 리턴하는 함수를 의미한다. 커링 함수를 고안한 논리학자 하스켈 커리(Haskell Curry)의 이름을 따왔다.

📌내장 고차 함수

✔️ filter()

조건에 맞는 데이터만 분류(filtering) 할 때 사용한다.

const foods = [
  {
    menu = "hamburger",
    store = "Macdonald",
    price = 5600
    
  },
  {
    menu = "pizza",
    store = "Domino"
    price = 21200
  },
  // ... 생략
]; 

// store가 Macdonald 인지 확인하는 함수
const isMacdonald = function (foods) {
  return foods.store === "Macdonald";
}; 

// Macdonald 메뉴만 모임
const MacdonaldMenu = foods.filter(isMacdonald); 

✔️ map()

하나의 데이터를 다른 데이터로 매핑(mapping) 할 때 사용한다.

// 메뉴 하나의 store를 반환하는 함수
const findStore = function (foods) {
  return foods.store;
}; 

// 각 책의 부제 모음 
const stores = foods.map(findStore); // ['Macdonald', ...]

✔️ reduce()

여러 데이터를 하나의 데이터로 응축(reduce)할 때 사용한다.

// 메뉴 하나의 가격을 누적값에 더한다.
const priceReducer = function (sum, foods) {
  return sum + foods.averagePrice;
}; 

// 초기값에 0을 주고, 숫자의 형태로 가격을 누적한다.
let initialValue = 0 
// 모든 메뉴의 가격을 누적한 평균을 구한다.
const foodsAvgPrice = foods.reduce(priceReducer, initialValue) / foods.length;

📎 reduce() 의 또 다른 사용법

  • 배열을 문자열로 바꾸기
function joinName(resultStr, user) {
  resultStr = resultStr + user.name + ', ';
  return resultStr;
}

let users = [
  { name: 'Hyesoo', city: 'Hwaseong' },
  { name: 'Jimmy', city: 'Newyork' },
  { name: 'Julia', city: 'Roma' }
];

console.log(users.reduce(joinName, '')); // Hyesoo, Jimmy, Sindy
  • 배열을 객체로 바꾸기
function makeAddressBook(addressBook, user) {
  let firstLetter = user.name[0];

  if(firstLetter in addressBook) {
    addressBook[firstLetter].push(user);
  } else {
    addressBook[firstLetter] = [];
    addressBook[firstLetter].push(user);
  }

  return addressBook;
}

let users = [
  { name: 'Hyesoo', city: 'Hwaseong' },
  { name: 'Jimmy', city: 'Newyork' },
  { name: 'Julia', city: 'Roma' }
];

console.log(users.reduce(makeAddressBook, {}));
/* 실행결과
{
  H: [
    { name: 'Hyesoo', city: 'Hwaseong' }
  ],
  J: [
    { name: 'Jimmy', city: 'Newyork' },
    { name: 'Julia', city: 'Roma' }
  ]
}
*/
profile
hello world!

0개의 댓글