본문 바로가기
프로그래밍 언어/JavaScript

map, filter, reduce

by zieunee 2021. 7. 5.
반응형

map, filter, reduce

    const products = [
        {name: '안녕', price: 12000},
        {name: '하세요', price: 15000},
        {name: '저는', price: 20000},
        {name: '지니', price: 25000},
        {name: '입니다', price: 15000}
    ];

map

map 로직

const map = (f, iter) => {//f 라는 함수를 받아서 어떤값을 수집할 것인지 위임한다.(추상화)
        let res = [];
        for (const a of iter) {
            res.push(f(a));
        }
        return res;
    };
  • 고차함수이다.
 /////////////es5 ///////////////

  let names = [];
    for (const p of products) {
      names.push(p.name); // 직접적으로 코딩을 함 
    }
    log(names);

 /////////////es6 ///////////////
///////////위의 내용을 간단하게 작성
    log(map(p => p.name, products));
  • map 함수의 보조함수를 통해서 products안에 있는 1:1로 매핑되는 값을 전달하겠다는 보조 함수 전달

map의 다형성

map 함수는 이터러블 프로토콜을 따르고 있음

    log(map(a => a * a, gen()));

    let m = new Map();
    m.set('a', 10);
    m.set('b', 20);
    log(new Map(map(([k, a]) => [k, a * 2], m)));
  • 새롭게 map을 받아서 value를 조작할 수 있음

Filter

Filter 로직

 const filter = (f, iter) => {
        let res = [];
        for (const a of iter) {
            if (f(a)) res.push(a);
        }
        return res;
    };
   /////////////////es5/////////////////
   let under20000 = [];
    for (const p of products) {
      if (p.price < 20000) under20000.push(p);
    }
    log(...under20000);

   /////////////////es6/////////////////
    log(...filter(p => p.price < 20000, products));

Reduce

값을 축약하는 함수

array 를 모든 데이터를 축약해서 원하는 새로운 값(함수에 따른 새로운 값) 을 만든다.

Reduce 로직

    const reduce = (f, acc, iter) => {
        if (!iter) {
            iter = acc[Symbol.iterator]();
            acc = iter.next().value;
        }
        for (const a of iter) {
            acc = f(acc, a);
        }
        return acc;
    };
  const nums = [1, 2, 3, 4, 5];

   /////////////////es5/////////////////
    let total = 0;
    for (const n of nums) {
        total = total + n;
    }

   /////////////////es6/////////////////
     const add = (a, b) => a + b;

    log(reduce(add, 0, [1, 2, 3, 4, 5]));
    // 15

    //위의 내용 실행 하는 순서는 아래와 같다. 재귀적으로 실행
    log(add(add(add(add(add(0, 1), 2), 3), 4), 5));
    // 15

    log(reduce(add, [1, 2, 3, 4, 5])); //시작하는 값 생략
    // 15

reduce 를 통해 어떻게 축약하나?

모든 가격 다 더하기

reduce((totalprice,product) => total_price + product.price, 0 , products);

짬뽕해서 사용해보기

const add = (a, b) => a + b;
reduce(
    add, 
    map(p => p.price , 
        filter(p => p.price <23, products)));
반응형

'프로그래밍 언어 > JavaScript' 카테고리의 다른 글

vanlia javascript 에서 router 구현  (0) 2021.07.17
webpack  (0) 2021.07.16
ES6 이터러블 /이터레이터, 리스트 순회  (0) 2021.07.03
promise / async await  (0) 2021.06.29
javascript 콜백 promise  (0) 2020.04.10