-
Notifications
You must be signed in to change notification settings - Fork 2
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
b08ef85
commit 3ee2483
Showing
1 changed file
with
103 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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로 할 수 있는것** | ||
함수의 값을 로깅하고 해당 함수를 다시 실행 누적하면서 특정 시점의 상태로 갈 수 있음. | ||
|
||
- 실행 취소/복귀 | ||
- 사용자 입력 다시 실행 | ||
- 변경 시점의 상태로 디버깅 |