고차함수

서민수·2023년 8월 28일
0

자바스크립트

목록 보기
20/25

고차함수

  • 하나 이상의 함수를 매개변수로 취하거나 함수를 결과로 반환하는 함수
  • 매개변수로 전달되는 함수는 콜백 함수(Callback function)
  • 대표 배열 조작 메서드

    임의 정렬: Array.sort(callback funtion)
    반복 작업: Array.forEach()
    콜백함수 결과 배열 반환: Array.map()
    조건 만족하는 하나의 값 반환: Array.find()
    조건 만족하는 값 배열로 반환: Array.filter()
    누적 결과 값 반환: Array.reduce()

sort() 문제와 한계점

  • 문제점: 일의 자리 4가 10의 자리보다 뒤쪽에 정렬
  • 원인: sort 메서드로 정렬될 때 배열의 요소가 일시적으로 문자열로 변경되어 발생

// Number, String 정렬을 할 때 String으로 변환되어 4와 10을 문자열 기준으로 바꾼다.
// 단순 4와 10을 4 1로 판단하여 10이 앞으로 오게된다.
let nums = [1, -1, 4, 0, 2, 3, 10, 20, 12];

console.log(nums.sort());
// output: [-1, 0, 1, 10, 12, 2, 20, 3, 4]
// 10이 중간에 들어오게된다
console.log(nums.reverse());
// output: [4, 3, 20, 2, 12, 10, 1, 0, -1]
  • 한계점: 대소문자 구분 없이 정렬하고 싶지만, 대소문자 구분되어 정렬
let fruits = ["apple", "Orange", "orange", "melon"];
// 대문자가 소문자보다 큰값으로 적용된다.
console.log(fruits.sort());
// output: ['Orange', 'apple', 'melon', 'orange']
console.log(fruits.reverse());
// output: ['orange', 'melon', 'apple', 'Orange']

sort() 고차함수

  • .sort()함수의 매개변수로 함수를 넣어 고차함수를 이용한 정렬 수행 가능
let nums = [1, -1, 4, 0, 2, 3, 10, 20, 12];

console.log(nums.sort());
// output: [-1, 0, 1, 10, 12, 2, 20, 3, 4]
// 10이 중간에 들어오게된다
console.log(nums.reverse());
// output: [4, 3, 20, 2, 12, 10, 1, 0, -1]

let ascending_order = function (x, y){ 
  // 콜백함수를 사용하여 정렬을 바꿔준다.
 return x-y;  
  // x 1 y -1일때 연산을하게 되면 1-1 0 0보다 큰 값이 되어 둘의 위치를 바꿔주게 된다. 
  // 또 -1 4를 비교했을 때 음수가 나오게 되기 때문에 변하지 않는다. 
};

let ascending_order = function (x, y){
 return y-x; 
  // x가 12 y 20일때 연산을 하면 20 - 12 = 8로 양수가 나오기 때문에
  // 두 수의 위치를 바꿔준다
};
  • 문자열 정렬
let ascending_order = function(x, y){
  x = x.toUpperCase();
  y = y.toUpperCase(); // 대문자로 모두 치환한후 연산
  
  if (x > y) // 오름차순 x가 y보다 크면 자리를 바꿔주고
    return 1;
  else if (y > x) // y가 x보다 크다면 뒤로
    return -1;
  else 
    return 0;
};


let descending_order = function(x, y){
  x = x.toUpperCase();
  y = y.toUpperCase(); 
  
  if (x < y) //  
    return 1;
  else if (y < x) 
    return -1;
  else 
    return 0;
};

let fruits = ["apple", "Orange", "orange", "melon"];
console.log(fruits.sort(ascending_order));
// output: ['apple', 'melon', 'Orange', 'orange']
console.log(fruits.sort(descending_order));
// output: ['Orange', 'orange', 'melon', 'apple']
profile
안녕하세요

0개의 댓글