이번에는 filter에 대해서 다뤄보자.
필터는 아래와 같이 데이터가 구성되어져 있을 때 특정 금액 이상의 상품만 걸러낸다거나 특정 금액 이하의 상품만 걸러낸다거나 하는 식의 코드이다.
<script>
const products = [
{ name: '반팔티', price: 15000 },
{ name: '긴팔티', price: 20000 },
{ name: '핸드폰케이스', price: 15000 },
{ name: '후드티', price: 30000 },
{ name: '바지', price: 25000 }
];
</script>
아래의 코드가 있다.
let under20000 = [];
for (const p of products) {
if (p.price < 20000) under20000.push(p);
}
log(...under20000);
let over20000 = [];
for (const p of products) {
if (p.price >= 20000) over20000.push(p);
}
log(...over20000);
=>
{name: "반팔티", price: 15000}name: "반팔티"price: 15000[[Prototype]]: Object {name: "핸드폰케이스", price: 15000}
{name: "긴팔티", price: 20000}name: "긴팔티"price: 20000[[Prototype]]: Object {name: "후드티", price: 30000} {name: "바지", price: 25000}
filter로 리팩토링을 해보면 리턴하는 값은 부수효과로(ex) log(...under20000); 출력을 하는 것이 아니라 함수의 return값으로 출력을 해주고 iter을 넣어주어서 이터러블 프로토콜을 따르도록 해준다.
그리고 보조함수(f)에게 위임(f(a))하는 식으로 해준다.
const filter = (f, iter) => {
let res = [];
for (const a of iter) {
if (f(a)) res.push(a);
}
return res;
};
log(...filter(p => p.price < 20000, products));
log(...filter(p => p.price >= 20000, products));
내부에 있는 다양성은 보조함수를 통해서 걸러낼 수 있다. 아래코드를 보자.
log(filter(n => n % 2, [1, 2, 3, 4]));
=>
[1, 3]
외부에 경우는 이터러블 프로토콜을 따르는 것을 통해서 다양성을 지원해줄 수 있다. 즉 filter 역시 많은 것을 걸러낼 수 있다.
필터를 하는데 제너레이터 함수를 실행해서 아래와 같이해주고 확인을 해보면 [1, 3, 5]가 나오는 것을 볼 수 있다.
log(filter(n => n % 2, function* () {
yield 1;
yield 2;
yield 3;
yield 4;
yield 5;
}()));
=>
[1, 3, 5]
filter함수 역시 이터러블 프로토콜을 따르고 함수형적인 코딩을 통해서 구현해서 중복을 제거해보았다.
<출처 : 유인동 함수형 프로그래밍과 JavaScript ES6+>
https://www.inflearn.com/course/functional-es6/dashboard
함수형 프로그래밍과 JavaScript ES6+ - 인프런 | 강의
ES6+와 함수형 프로그래밍을 배울 수 있는 강의입니다. 이 강좌에서는 ES6+의 이터러블/이터레이터/제너레이터 프로토콜을 상세히 다루고 응용합니다. 이터러블을 기반으로한 함수형 프로그래밍,
www.inflearn.com
'JavaScript > 함수형 프로그래밍과 JavaScript ES6+' 카테고리의 다른 글
map+filter+reduce 중첩 사용과 함수형 사고 (0) | 2021.08.18 |
---|---|
About Reduce (0) | 2021.08.18 |
이터러블 프로토콜을 따른 map의 다형성 (0) | 2021.08.18 |
map, filter, reduce(map) (0) | 2021.08.17 |
odds(제너레이터와 이터레이터) & for of etc.. (0) | 2021.08.17 |