From 3ee24834b151ab6aaf9ad587c47cbf466b05de62 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=A0=95=EB=8C=80=EC=9C=A4?= <59507527+sensecodevalue@users.noreply.github.com> Date: Sat, 16 Nov 2024 13:35:10 +0900 Subject: [PATCH] =?UTF-8?q?=EC=A0=95=EB=8C=80=EC=9C=A4=2012=EC=9E=A5=20(#7?= =?UTF-8?q?1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\354\240\225\353\214\200\354\234\244.md" | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 "\354\261\225\355\204\260_12/\354\240\225\353\214\200\354\234\244.md" diff --git "a/\354\261\225\355\204\260_12/\354\240\225\353\214\200\354\234\244.md" "b/\354\261\225\355\204\260_12/\354\240\225\353\214\200\354\234\244.md" new file mode 100644 index 0000000..cec97f9 --- /dev/null +++ "b/\354\261\225\355\204\260_12/\354\240\225\353\214\200\354\234\244.md" @@ -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로 할 수 있는것** +함수의 값을 로깅하고 해당 함수를 다시 실행 누적하면서 특정 시점의 상태로 갈 수 있음. + +- 실행 취소/복귀 +- 사용자 입력 다시 실행 +- 변경 시점의 상태로 디버깅