Skip to content

Commit

Permalink
정대윤 12장 (#71)
Browse files Browse the repository at this point in the history
  • Loading branch information
sensecodevalue authored Nov 16, 2024
1 parent b08ef85 commit 3ee2483
Showing 1 changed file with 103 additions and 0 deletions.
103 changes: 103 additions & 0 deletions 챕터_12/정대윤.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
# 함수형 반복

> 함수형 도구을 어떻게 구현하는가?
> map, reduce, filter 배열의 반복을 해결해주는 함수향 도구
다시 한번 보는 리팩터링 순서

- 함수 이름의 암무적 인자 찾기 (함수 이름의 구현 일부의 이름)
- 암묵적 인자 들어내기 => 값을 일급으로 승격
- 함수 본문을 콜백으로 바꾸기 => 본문을 일급으로 승격

### forEach

```js
const forEach = (array, f) => {
for (let i = 0; i < array.length; ++i) {
f(array[i]);
}
};
```

### map

A 배열의 item x를 새로운 배열B의 item y로 바꾸는 것.
넘겨진 함수가 계산이라면 map도 계산이됨.

```js
const map = (array, xToY) => {
const n = [];
forEach(array, (item)) => {
n.push(f(item))
});
return n;
}
```

인자를 통해 함수의 인자가 무엇인지 알 수 있도록하자.

```js
const emailsForCustomer = (customers) =>
map(customers, (customer) => customer.email);
```

ex) 고객의 이메일 리스트를 주세요.

> map의 경우, null을 반환할 수 있음.
> 여러분들은 어떻게 null을 없애는가?
>
> - filter().map()
> - reduce
> - function mapWithNull = customFunction => map은 동일한 길이의 값을 반환해야되는데 이러면 바뀌자녀.
### filter

filter는 일부 항목을 선택하는 함수로 predicate를 통해 item을 선택

```js
// selector or predicate=boolean을 반환하는 함수.
const filter = (array, selector) => {
const n = [];

forEach(array, (item) => selector(item) && n.push(n));

return n;
};
```

ex) 이메일이 있는 고객을 알려주세요.

### reduce

값을 누적하며 순회함.

초기값 설정

- 계산이 어떤 값에서 시작되는지와 배열이 비었다면 어떤값을 반화할지를 보고 결정할 것.

```js
const reduce = (array, init, combine) => {
let acc = init;
forEach(array, (item) => {
init = f(acc, array);
});
return acc;
};
```

ex) max, sum, min

```js
/**
* - reduce로 map 만들기
* - reduce 내부에서 지역적인 변이가 일어남으로 외부 세계에 영향을 안줌 이는 계산이라고 볼 수 있음.
* */
const map = (array, xToY) => reduce(array, [], (acc, item) => acc.push(item));
```

**reduce로 할 수 있는것**
함수의 값을 로깅하고 해당 함수를 다시 실행 누적하면서 특정 시점의 상태로 갈 수 있음.

- 실행 취소/복귀
- 사용자 입력 다시 실행
- 변경 시점의 상태로 디버깅

0 comments on commit 3ee2483

Please sign in to comment.