ํฐ์คํ ๋ฆฌ ๋ทฐ
[๊ฐ์๋ ธํธ] ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์์๋ณด๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ 1
Carrot๐ฅ 2020. 8. 5. 22:16** โ priv | ๊ฐ์๋
ธํธ
์นดํ
๊ณ ๋ฆฌ์ ์๋ ๋ด์ฉ์ ๋ฐํ์ด ๋ชฉ์ ์ด ์๋๊ธฐ ๋๋ฌธ์ ์ ํ ์ ์ ๋์ด์์ง ์์ต๋๋น.**
๐ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ
์์ํจ์
ํญ์ input์ด ๊ฐ์ผ๋ฉด output๋ ๊ฐ๋ค
๋ถ์ํจ๊ณผ๊ฐ ์๋ค(์ธ๋ถ์ ์ํฅ์ ๋ผ์น๊ฑฐ๋ ๋ฐ์ง ์์ ex)์ธ๋ถ๋ณ์๋ฅผ ๋ณํ,์ด์ฉํ์ง์๋๋ค. console.log ๋ฑ๋ ๋ถ์ํจ๊ณผ)
๋ชจ๋ํ์ ์กฐํฉ
๋์์ฑ
๋น๋๊ธฐ์ ์ ๋ฆฌ
์ผ๊ธํจ์
ํจ์ํ ํ๋ก๊ทธ๋จ์ ๋ํ์ ์์ add_maker
๐ธ ๋ช ๋ นํ์ ํจ์ํ์ผ๋ก ์ ํํ๊ธฐ
user๋ค์ name, age๋ฅผ ๊ฐ์ง ๊ฐ์ ๋ฅผ ํน์ ์กฐ๊ฑด์ผ๋ก ๋ถ๋ฅ
์์ฉํ (์ ์ฉํ)ํ๋ก๊ทธ๋๋ฐ : ํจ์๋ฅผ ์ธ์๋ฅผ ๋ฐ์์ ์ํ๋ ์์ ์ ํ๊ฐํด์ ๋ก์ง์ ์์ฑ
filter ->์์ฉํ(์ ์ฉํ) ์์ฉํ ํจ์
๊ณ ์ฐจํจ์์ด๊ธฐ๋ํจ (ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๊ฑฐ๋ ํจ์๋ฅผ ๋ฆฌํด)
filter๋ก ๋ฆฌํฉํ ๋ง
_filter(users, predicate)
function _filter(list, predi){
let new_list = [];
for(let i=0; list.length; i++){
if(predi(list[i])){
new_list.push(list[i]);
}
}
return new_list;
}
์ฌ์ฉ ์
filter(users, function(user) { return user.age >= 80 });
filter([1,2,3,4], function(num) { return num%2 });
filter([1,2,3,4], function(num) { return !(num%2) });
์ด๋ค ๊ฐ์ด ๋ฐฐ์ด์ ๋ค์ด์๋์ง ๊ฑธ๋ฌ๋ผ ์ ์๋ ์ฌํ์ฉ์ฑ์ด ๋์ ํจ์๊ฐ ๋๋ค.
map ์ผ๋ก ๋ฆฌํฉํ ๋ง
function _map(list, mapper){
let new_list = [];
for(let i=0; list.length; i++){
new_list.push(mapper(list[i]));
}
return new_list;
}
์ด๋ ๊ฒ ๋ง๋ค์ด์ง ํจ์๋ค์ ์ฌ์ฉํ ๋
๋์ ๋ฌธ์ ์ฌ์ฉํ๋๊ฒ ์๋๋ผ ์ฝ๋๋ฅผ ์ค์ฒฉํ๋ ์์ผ๋ก ์ฌ์ฉํ๋๊ฒ ์ข๋ค.
_map(
_filter(users, (users) => user.age >= 30),
(user) => user.name
)
age=30 ์ธ ์ ์ ๋ฅผ ๊ฑธ๋ฌ๋ด๊ณ ,
๊ทธ๊ฒ๋ค์ name ๋ง mapping ํด์ ๋ฆฌํด
_each
_filter ์ _map ์๋ ์ค๋ณต๋ ๋ถ๋ถ(์ปฌ๋ ์ ๊ธธ์ด๋งํผ loop)์ด ์๋ค.
๊ทธ ๋ถ๋ถ์ _each ๋ก ๋ชจ๋ํ ํ ์ ์์
function _each(list, iter){
for(let i=0; i < list.length; i++){
iter(list[i]);
}
return list;
}
list
๋ฅผ ๊ทธ๋๋ก ๋ฆฌํดํ๋ ์ด์ ๋,
_each ํจ์๋ ๋ถ์ํจ๊ณผ(side effect)๊ฐ ์๋ ํจ์์ด๊ธฐ ๋๋ฌธ์ด๋ค.
_each ํจ์์ ๋ถ์ํจ๊ณผ๋ ๋ด๋ถ์ ๊ฐ์ ์ง์ ์ ์ธ ๋ณํ๋ฅผ ์ฃผ๋ ์ผ(ํจ์๋ฅผ ์คํ)์ ํ๋ค๋ ๊ฒ์ด๋ค.
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์
์ด์๊ฐ์ด ์ ๋ฌํ ์ธ์์ ๊ฐ์ ๊ฐ์ด ๋์ค๋๊ฒฝ์ฐ ๋ถ์ํจ๊ณผ๊ฐ ์์์ ์์ํ ์ ์๋ค.
_map ์ ์ ์ฉ
function _map(list, mapper){
let new_list = [];
_each(list, (val) => { new_list.push(mapper(val)); });
return new_list;
}
_filter ์ ์ ์ฉ
function _filter(list, predi){
let new_list = [];
_each(list, (val) => {
if(predi(val)) new_list.push(val);
})
return new_list;
}
๐ธ ๋คํ์ฑ
map ์ด๋ filter ๊ฐ์ ํจ์๋ค์ ์ด๋ฏธ js ์ ์๋ ์ ๋ค์ธ๋ฐ ์ ๋ง๋ค์ด ์ธ๊น?
๊ฑ๋ค๋ ์ฌ์ค ๋ฉ์๋์ด๋ค. (๊ฐ์ฒด์งํฅ)
๋ฉ์๋๋ ํด๋น ํด๋์ค์ ์ธ์คํด์ค์๋ง ์ฌ์ฉ ํ ์ ์๋ค.
๊ทธ ๋ง์ ์ฆ์จ Array.prototype.map ๋ฉ์๋๋ Array ์๋ง ์ฌ์ฉ ๊ฐ๋ฅ
ex) document.querySelectorAll()
์ ๋ฐฐ์ด์ด ์๋๋ผ ArrayLike (NodeList) ๋ผ์ map ๋ฉ์๋๊ฐ ์ฌ์ฉ ๋ถ๊ฐ๋ฅ
๊ทธ์น๋ง _map์ ์ธ์์์ฅ
_map( document.querySelectorAll("*"), (node) => node.node.Name);
๋ฐ์ดํฐ ํ์ ๊ณผ ๊ด๊ณ์์ด (=Array๊ฐ ์๋์ด๋) ์ฌ์ฉํ ์ ์๊ณ ,
ํจ์ ์์ฒด๊ฐ ํผ์ ๋จผ์ ์กด์ฌํ๊ธฐ๋๋ฌธ์ ๊ฐ์ฒด๊ฐ ํน์ ์ธ์คํด์ค๊ฐ ์กด์ฌํ์ง ์์๋ ์ธ ์์๋ค.
ํ๊ฐ์์ ์ด ์๋์ ์ผ๋ก ์ ์ฐํด์ง
predi
/ iter
/ mapper
ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์์ ์ฝ๋ฐฑํจ์๋ณด๋ค๋ ๋ณด์กฐํจ์์ ์ด๋ฆ์ ์ญํ ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ด๋ฆ์ผ๋ก ๋ถ๋ฅธ๋ค
Array, ArrayLike, Object์ ๊ฐ์ ์ ๋ค์ ๋ค ๋๋ฆด ์ ์๋ค๋๊ฑด ์ธ๋ถ์ ๋คํ์ฑ์ ๋ํ ์ด์ผ๊ธฐ๊ณ
๋ณด์กฐํจ์๊ฐ ์ฌ์ฉํ๊ณ ๋ฑ๋ ์ ๋ค์ ๋ฐ์ดํฐํ์ ์ ์ง์ ๊ฐ๋ฐ์๊ฐ ์ง์ ํ ์ ์๋ค๋๊ฑด ๋ด๋ถ๋คํฅ์ฑ์ ๋ํ ์ด์ผ๊ธฐ์ด๋ค
๐ธ ์ปค๋ง
Currying์ ์ฌ๋ฌ ๊ฐ์ ์ธ์๋ฅผ ๊ฐ์ง ํจ์๋ฅผ ํธ์ถ ํ ๊ฒฝ์ฐ,
ํ๋ผ๋ฏธํฐ์ ์๋ณด๋ค ์ ์ ์์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ธ์๋ก ๋ฐ์ผ๋ฉด
๋๋ฝ๋ ํ๋ผ๋ฏธํฐ๋ฅผ ์ธ์๋ก ๋ฐ๋ ๊ธฐ๋ฒ์ ๋งํ๋ค.์ฆ ์ปค๋ง์ ํจ์ ํ๋๊ฐ n๊ฐ์ ์ธ์๋ฅผ ๋ฐ๋ ๊ณผ์ ์
n๊ฐ์ ํจ์๋ก ๊ฐ๊ฐ์ ์ธ์๋ฅผ ๋ฐ๋๋ก ํ๋ ๊ฒ์ด๋ค.๋ถ๋ถ์ ์ผ๋ก ์ ์ฉ๋ ํจ์๋ฅผ ์ฒด์ธ์ผ๋ก ๊ณ์ ์์ฑํด ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ฐ์ ์ฒ๋ฆฌํ๋๋ก ํ๋ ๊ฒ์ด ๊ทธ ๋ณธ์ง์ด๋ค.
_curry, _curryr
function _curry(fn){
return function(a, b) {
if (arguments.length == 2) return fn(a, b);
// ์ธ์๋ฅผ ํ๋๋ง ๋ฐ์๋ค๋ฉด ํ๋ฒ ๋ ๋ฐ๋ ํจ์๋ฅผ ๋ฆฌํด
return function(b) {
return fn(a, b);
}
}
}
const add = _curry(function(a, b){
return a + b;
});
const add10 = add(10);
console.log( add10(5) ); // 15
console.log( add(5)(3) ); // 8
console.log( add(5, 3); // 8
a
๋ง ๋ฐ์๋ค๋ฉด ํจ์๋ฅผ ๋ฑ๋๋ค => b
๋ฅผ ๋ฐ์ ํ์์ผ fn
์ ์คํ
a,b
๋ฅผ ํ๋ฒ์ ๋ฐ์์ผ๋ฉด ๋ฐ๋ก fn
์คํ
ํ๋ผ๋ฏธํฐ๋ฅผ ๋ค ๋ฐ์ ๋ ๊น์ง ํ๊ฐ์์ ์ ๋ฏธ๋ฃฌ๋ค
_curry ์ผํญ์ฐ์ฐ์๋ก
function _curry(fn){
return function(a, b) {
return arguments.length == 2 ? fn(a, b) : b => fn(a, b);
}
}
_curryr
curry right
ํ๋ผ๋ฏธํฐ๋ฅผ ์ค๋ฅธ์ชฝ๋ถํฐ
function _curryc(fn) {
return function(a, b) {
return arguments.length == 2 ? fn(a, b) : b => fn(b, a);
}
}
const sub = _curryr(function(a,b) {
return a - b;
});
console.log( sub(10, 5) ); // 10-5 = 5
const sub10 = sub(10);
console.log( sub10(5) ); // 5 -10 = -5
subtraction
_get
function _get(obj, key){
return obj == null ? undefined : obj[key];
}
console.log(_get(user1, "name"));
ํน์ key ๋ฅผ ๊ฐ์ง value ์ถ์ถ
_curryr
์ด์ฉ
const _get = _curryr( (obj, key) => {
return obj == null ? undefined : obj[key];
});
const getName = _get("name");
console.log( getName(user1) );
console.log( getName(users[0]) );
์์์ ๋ณด์ฌ์คฌ๋ ์๋ _get(key)
๋ก ๊ฐ๊ฒฐํ๊ฒ ํํ๊ฐ๋ฅ
_map(
_filter(users, (users) => user.age >= 30),
_get("name")
)
๐ธ reduce
_reduce([1,2,3], add, 0);
// ์๋์ ๊ฐ์ด ๋์ํ๋ค
add( add( add(0,1), 2 ), 3)
_reduce
๊ตฌํ
function _reduce (list, iter, memo){
_each(list, function(val){
memo = iter(memo, val);
})
return memo;
}
์ธ๋ฒ์งธ ์ธ์ memo
๊ฐ ์๋ต ๋ ๋
function _rest(list, num){
return Array.prototype.slice.call(list, num || 1);
}
Array.prototype.slice
์ Array ๋ง ์ฌ์ฉ ๊ฐ๋ฅํ๋ฏ๋ก
call(this,..)๋ฅผ ํตํด AraryLike ๊ฐ์ฒด๋ ์ฌ์ฉํ ์ ์๊ฒํจ
function _reduce (list, iter, memo){
if(arguments.length == 2){
memo = list[0];
list = _rest(list);
}
_each(list, function(val){
memo = iter(memo, val);
})
return memo;
}
๐ธ ํ์ดํ๋ผ์ธ, _go, _pipe, ํ์ดํ ํจ์
function _pipe(){
var fns = arguments;
return function(arg){
return _reduce(fns, (arg, fn) => fn(arg), arg);
}
}
var f1 = _pipe(
function(a) { return a+1 }, // 1+1
function(a) { return a*2 } // 2*2
)
console.log( f1(1) );
ํจ์๋ฅผ ์ธ์๋ก ๋ฐ์์ ์ฐ์์ ์ผ๋ก ์คํ
ํจ์๋ฅผ ๋ฆฌํดํ๋ ํจ์
memo val
fns[0](arg)
, fns[1]
fns[1]( fns[0](arg) )
memo val
fns[1]( fns[0](arg) )
, fns[2]
fns[2]( fns[1]( fns[0](arg) ) )
reduce
๋ ๋งจ ์ฒ์ ๋ง๋ memo ๊ฐํํ
์ฐจ๋ก๋๋ก ํจ์๋ฅผ ํ๋์ฉ ๋ถ์ฌ์ฃผ๋๊ฑฐ
_go( 1,
function(a) { return a + 1 },
function(a) { return a * 2 },
function(a) { return a * a },
consol.log
);
์ฒซ๋ฒ์งธ ๋ฐ์ ๊ฐ์ ์ฐจ๋ก๋๋ก ํจ์๋คํํ ์ญ์ญ์ญ ๋ฃ๊ณ ๋ง์ง๋ง์ ์ฝ์๋ก๊ทธ
function _go(arg){
var fns = _rest(arguments);
return _pipe.apply(null, fns)(arg);
}
_filter, _map ํํ _curryr ๊ฑธ์ด์ ์๋์ ๊ฐ์ด ์ธ ์๋ ์์
_go(users,
_filter( user => user.age < 30 ),
_map( _get("age") ),
console.log
)
๐ธ ๋คํ์ฑ ๋์ด๊ธฐ, _keys, ์๋ฌ
_each ์ ์ธ๋ถ ๋คํ์ฑ ๋์ด๊ธฐ
- _each ์ null ์ ๋ฃ์ด๋ ์๋ฌ ์๋๊ฒ
function _each(list, iter){
for(let i=0; i < list.length; i++){
iter(list[i]);
}
return list;
}
// ์๊ฐ ์๋ _each
var _length = _get("length"); // _get ํจ์๋ null ์ ๊ฑธ๋ฌ๋
function _each(list, iter){
for(let i = 0, len = _length(list); i < len; i++){
iter(list[i]);
}
return list;
}
_each(null, console.log);
>> ๋๋ฆด๋งํ ๋ฐ์ดํฐ๊ฐ ์์ด์ ์๋ฌด๊ฒ๋ ์ํจ
_map(null, v => v);
>> ๋น๋ฐฐ์ด ๋ฆฌํด
_filter(null, v => v);
>> ๋น๋ฐฐ์ด ๋ฆฌํด
null
๊ฐ์ ํ๋ ค๋ณด๋ด์ผ ํจ์๋ฅผ ์ฐ์์ ์ผ๋ก ์คํํด๋ ๋ฌธ์ ๊ฐ ์๋๋๊น
ํน๋ณํ ํ์ ์ฒดํฌ๋ฅผ ํ์ง์๊ณ
try, catch๋ฅผ ์ฌ์ฉํ์ง์๊ณ
๊ทธ๋ฅ ์ฃผ๋ฅด๋ฅด๋ฅต
- _keys ๋ง๋ค๊ธฐ :
object
์ธ์ง ๊ฒ์ฌํด์null
์๋ฌ ์๋๊ฒ
Object.keys( Object.keys( obj ) )
obj์ key๋ค๋ง ๋ชจ์์ ๋ฐฐ์ด์ ๋ด๋ ๋ฉ์๋
null
์ ๋ฃ์ผ๋ฉด ์๋ฌ๋จ -> ์ด๊ฑธ ๊ณ ์น๋๊ฑฐ์ ์๋ฌ์๋๊ณ ๋น๋ฐฐ์ด ๋ฑ๋๋ก!
function _is_object(obj){
return typeof obj == 'object' && !!obj;
// null ์ด ๋ค์ด์ค๋ฉด !!null ์ฆ false ๋ฅผ ๋ฐํ
// ์ฐ object ๊ฐ ๋ค์ด์์ผ์ง๋ง true ๋ฐํ
}
function _keys(obj){
return _is_object(obj) ? Object.keys(obj) : [];
}
- _each ์ธ๋ถ ๋คํ์ฑ ๋์ด๊ธฐ
_each({
13: "A",
19: "BB",
21: "CCC",
50: "DDDD",
}, name => console.log(name) )
์๋์ _each๋ ์๊ฑฐ ์๋์ํจ >> ๋ฐฐ์ด์ด ์๋๋๊น!!!!
function _each(list, iter){
var keys = _key(list);
for( var i = 0; i< keys.length; i++){
iter(list[keys[i]]);
}
return list;
}
// null ๊ฐ ํ๋ ค๋ณด๋ด๋ ค๊ณ
function _each(list, iter){
var _is_object = (obj) => typeof obj == 'object' && !!obj;
var keys = _is_object(list) ? Object.keys(list) : [];
for( var i = 0; i< keys.length; i++){
iter(list[keys[i]]);
}
return list;
}
!!!!!!!!!!!Array/Object ๋๋ค ์ฌ์ฉ๊ฐ๋ฅํ๊ฒ!!!!!!!!!!!
var obj = {
a: "one",
b: "two",
c: "three"
};
var arr = ["ใฑ","ใด","ใท"]
Object.keys(obj) ----> ["a", "b", "c"]
Object.keys(arr) ----> ["0", "1", "2"]
// array, object ๋๋ค ๋์ํ๋๋ก & null ๊ฐ ํ๋ ค๋ณด๋ด๊ธฐX
function _each(list, iter){
var keys = Object.keys(list);
for( var i = 0; i< keys.length; i++){
iter(list[keys[i]]);
}
return list;
}
์์ฐ.. ์ฐ์์ฐ์ ์๋ฆ๋ต๋ค!!!!!!!
'๊ณต๋ถ > priv | ๊ฐ์๋ ธํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
- array
- stackoverflow
- ๋ฐ๋๋ผ์ฝ๋ฉ ํ๊ธฐ
- ๋ถํธ์บ ํ
- GIT
- ๋ฐ๋๋ผ์ฝ๋ฉ
- DOM
- eventlistener
- Stash
- review
- ์์ฑ์ํจ์
- KEYBOARD
- css
- HTML
- book
- ์ฝ๋ฉ๋ถํธ์บ ํ
- string
- eslint
- VSC
- js
- Total
- Today
- Yesterday