본문 바로가기
Programming Language

JS33 - 19.map, reduce, filter

by 양찬우 2021. 6. 3.
728x90

왜 써야하나요?

  • 코드 간결성
  • 함수형 프로그래밍!
  • for, forEach 루프 관리 안해도 된다!
  • Array.prototype에 정의되어 있으므로 어떤 배열에서도 사용할 수 있다!!

map()

  • map() 메소드는 배열의 모든 요소에 제공된 함수를 적용하여, 결과로 새 배열을 생성한다.
  • map에 전달한 콜백은 명시적으로return 문을 가져야한다. 그렇지 않으면map은undefined로 가득 찬 배열을 출력합니다.
  • 콜백 인자
    param meaning
    elem 요소 값
    index 각 순회의 인덱스는 왼쪽에서 오른쪽으로 이동
    array 메소드를 호출 한 원래의 배열
    thisArg (선택 사항) 콜백에서 this로 참조 될 객체
array.map(function(elem, index, array) {
      ...
}, thisArg);

// 예시
const numbers = [2, 4, 8, 10];  
const halves = numbers.map(x => x / 2);// halves is [1, 2, 4, 5]

filter()

  • filter() 메소드는 배열의 모든 요소에 제공된 함수의 조건을 만족하는지 판단하여, 결과로 새 배열을 생성한다.
  • 콜백이 무조건 true혹은 false를 return해야 한다. 만약 return 문을 안 쓰면 콜백은 undefined를 반환하고, filter는 오류를 뱉는 대신 false값만 나올 것이다.
  • 콜백 인자
    param meaning
    elem 요소 값
    index 각 순회의 인덱스는 왼쪽에서 오른쪽으로 이동
    array 메소드를 호출 한 원래의 배열
    thisArg (선택 사항) 콜백에서 this로 참조 될 객체
array.filter(function(elem, index, array) {
      ...
}, thisArg);

// 예시
const words = ["spray", "limit", "elite", "exuberant", "destruction", "present"];  
const longWords = words.filter(word => word.length > 6);
// longWords is ["exuberant", "destruction", "present"]

reduce()

  • reduce() 메소드는 배열의 각 요소(좌 -> 우)에 대해 누적값(accumulator)과 함께 함수를 적용하여 단일 값으로 감소시킨다.
    • 이 때 단일 value는 숫자가 아니다. 즉, 단일 배열을 반환할 수도 있다!
  • map(),filter()와 유사하지만 콜백 인수가 다르다.
  • 콜백 인자
    param meaning
    prevValue 각 콜백을 통해 반환 된 누적 값 (accumulator)
    elem 요소 값
    index 각 순회의 인덱스는 왼쪽에서 오른쪽으로 이동
    array 메소드를 호출 한 원래의 배열
    initialValue (선택 사항) 첫 번째 (가장 왼쪽) 콜백에서 첫 번째 인수로 사용되는 객체입니다.
array.reduce(function(prevVal, elem, index, array) {
      ...
}, initialValue); // initialValue 입력안하면 배열의 0번 인덱스를 사용한다.
    
// 예시
const total = [0, 1, 2, 3].reduce((acc, value) => acc + value, 1);// total is 7
  • 콜백 함수의 호출의 결과를 다음 콜백 함수의 호출로 전달하여 속임수 같이 동작할 수 있게 한다.

Compose Functions (함수의 합성)

  • reduce 함수합성 예시
    const compose = (...fns) => x => fns.reduceRight((v, f) => f(v), x);
    /*  
    const compose = (...fns) => {
    	return (x) => {
    		return fns.reduceRight((v, f) => f(v), x)
    	}
    };
    */
  • compose는 커링 패턴 형태로써 부분적으로 적용되며, 그 결과를 다음 함수로 전달한다. rest parameters 가 사용된 것을 주목하라. 때문에 원하는 만큼의 함수를 전달 하여 fns 배열에 넣을 수 있는 것이다.수집된 함수의 배열(fns)에 x를 초기값으로 전달하여 reduceRight를 호출하여 반환한다.
  • reduceRight는 reduce와 기능은 같지만 배열의 끝에서 시작하여 시작점으로 이동한다.
  • 그런 compose에 함수들을 전달한 다음 초기 값 (x)를 입력하면 된다.
  • 사용 예시
    const add1 = n => n + 1;  
    const double = n => n * 2;const add1ThenDouble = compose(  
      double,  
      add1  
    );add1ThenDouble(2); // 6  
    // ((2 + 1 = 3) * 2 = 6)

프로미스 체이닝

let itemIDs = [1, 2, 3, 4, 5];
itemIDs.reduce((promise, itemID) => {  
  return promise.then(_ => api.deleteItem(itemID));  
}, Promise.resolve());

// 위와 동일
Promise.resolve()  
.then(_ => api.deleteItem(1))  
.then(_ => api.deleteItem(2))  
.then(_ => api.deleteItem(3))  
.then(_ => api.deleteItem(4))  
.then(_ => api.deleteItem(5));

Find

// definition 
collection.find((item) => {
    // return first element that satisfy the condition
});
// example
const arr = [1,2,8,4,5];
const value = arr.find(i => i%4 == 0);
// return the first value i.e 8 
  • Find는 배열에서 작동하고 함수에서 조건을 만족하는 첫 번째 요소를 반환합니다.일부 실제 시나리오 + 일부 ES6에서 사용할 수 있습니다.
  • Note: 쉽고 단순하지만 대용량 data set에서는 효율적이지 않은 이유는 무엇입니까? 여길 보세요
728x90

댓글