ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

** โš  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 ์˜ ์™ธ๋ถ€ ๋‹คํ˜•์„ฑ ๋†’์ด๊ธฐ

  1. _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๋ฅผ ์‚ฌ์šฉํ•˜์ง€์•Š๊ณ 

๊ทธ๋ƒฅ ์ฃผ๋ฅด๋ฅด๋ฅต

  1. _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) : [];
}
  1. _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;
}

์™€์šฐ.. ์šฐ์•„์šฐ์•™ ์•„๋ฆ„๋‹ต๋‹ค!!!!!!!

๋Œ“๊ธ€