Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[정대윤] 챕터 12: 함수형 반복 #71

Merged
merged 1 commit into from
Nov 16, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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로 할 수 있는것**
함수의 값을 로깅하고 해당 함수를 다시 실행 누적하면서 특정 시점의 상태로 갈 수 있음.

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