JavaScript-함수형 언어 (3)

3 분 소요

map함수

  • map함수는 iterable객체의 값들에 조회하여 조작을 거쳐 배열로 리턴하는 함수이다.
  • iterable한 객체이면 map은 무조건 쓸 수 있다.
  • 더불어 generator를 통해 왠만한건 iterable하게 만들 수 있으므로 사실상 map은 거의 다 쓰일 수 있는 함수이다.
const product = [
  { name : '패딩', price : 200000 },
  { name : '바지', price : 150000 },
  { name : '맨투맨', price : 100000 },
  { name : '후리스', price : 50000 }
];

// 일반적인 map의 구조
const map = (f, iter) => {
  let res = [];
  for (const a of iter) {
    res.push(f(a));
  }
  return res;
};

console.log(map(p => p.name, product));
console.log(map(p => p.price, product));

console.log(product.map(p => p.name));
console.log(product.map(p => p.price));

/*
[ '패딩', '바지', '맨투맨', '후리스' ]
[ '패딩', '바지', '맨투맨', '후리스' ]
[ 200000, 150000, 100000, 50000 ]
[ 200000, 150000, 100000, 50000 ]
*/
const map = (f, iter) => {
  let res = [];
  for (const a of iter) {
    res.push(f(a));
  }
  return res;
};
let m = new Map();
m.set('a', 1);
m.set('b', 2);
m.set('c', 3);
let iter = m[Symbol.iterator]();
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());
console.log(iter.next());

console.log(map(([k, v]) => [k, v * 10], m));

/*
{ value: [ 'a', 1 ], done: false }
{ value: [ 'b', 2 ], done: false }
{ value: [ 'c', 3 ], done: false }
{ value: undefined, done: true }
[ [ 'a', 10 ], [ 'b', 20 ], [ 'c', 30 ] ]
*/

filter함수

  • filter함수는 콜백함수로 조건식을 넣어서 해당 조건에 맞는 값들만을 배열에 넣어 반환한다.
const product = [
  { name : '패딩', price : 200000 },
  { name : '바지', price : 150000 },
  { name : '맨투맨', price : 100000 },
  { name : '후리스', price : 50000 }
];

const filter = (f, iter) => {
  let res = [];
  for (const a of iter) {
    if (f(a)) res.push(a);
  }
  return res;
};

console.log(...filter(p => p.price < 170000, product));
console.log(...filter(p => p.name === '후리스', product));

console.log(...product.filter(p => p.price < 170000));
console.log(...product.filter(p => p.name === '후리스'));

/*
{ name: '바지', price: 150000 } { name: '맨투맨', price: 100000 } { name: '후리스', price: 50000 }
{ name: '후리스', price: 50000 }
{ name: '바지', price: 150000 } { name: '맨투맨', price: 100000 } { name: '후리스', price: 50000 }
{ name: '후리스', price: 50000 }
 */

reduce함수

  • reduce함수는 iterable의 값을 다른 하나의 값으로 축약하는 함수이다.
  • iterable객체의 값들을 순회하면서 하나의 값으로 누적해나갈 때 이 함수를 사용한다.
const nums = [1, 2, 3, 4, 5];

const reduce = (f, acc, iter) => {
    if (!iter) {  // acc를 optional한 값으로 처리하기 위함.
        iter = acc[Symbol.iterator]();
        acc = iter.next().value;
    }
    for (const a of iter) {
        acc = f(acc, a);
    }
    return acc;
};

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

console.log(reduce(add, 0, nums));
console.log(reduce(add, nums));

const product = [
    { name : '패딩', price : 200000 },
    { name : '바지', price : 150000 },
    { name : '맨투맨', price : 100000 },
    { name : '후리스', price : 50000 }
];

console.log(product.reduce((total_price, product) => total_price + product.price, 0));

/*
15
15
500000
 */

map, filter, reduce 중첩사용

const product = [
    { name : '패딩', price : 200000 },
    { name : '바지', price : 150000 },
    { name : '맨투맨', price : 100000 },
    { name : '후리스', price : 50000 }
];

// 먼저 filter를 통해서 17000원 이하의 가격인 상품들을 뽑아내고 싶다.
const under170000 = product.filter(p => p.price < 170000);
console.log(under170000);

// 다음으로 필터링을 거친 가격들만을 map으로 뽑아내고 싶다.
const result = under170000.map(p => p.price);
console.log(result);

// 마지막으로 필터링을 거친 가격들의 합을 구하고 싶다.
const add = (a, b) => a + b;
const result_price = result.reduce(add);
console.log(result_price);

// 중첩문
const final_result01 = product
    .filter(p => p.price < 170000)
    .map(p => p.price)
    .reduce(add);
console.log(final_result01);

// 순서가 바뀌었지만 결과가 같은 중첩문
const final_result02 = product
    .map(p => p.price)
    .filter(n => n < 170000)
    .reduce(add);
console.log(final_result02);

/*
[ { name: '바지', price: 150000 },
  { name: '맨투맨', price: 100000 },
  { name: '후리스', price: 50000 } ]
[ 150000, 100000, 50000 ]
300000
300000
300000
*/

카테고리:

업데이트:

댓글남기기