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

** โš  priv | ๊ฐ•์˜๋…ธํŠธ ์นดํ…Œ๊ณ ๋ฆฌ์— ์žˆ๋Š” ๋‚ด์šฉ์€ ๋ฐœํ–‰์ด ๋ชฉ์ ์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ „ํ˜€ ์ •์ œ๋˜์–ด์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹น.**

 

๐ŸŒž ์ปฌ๋ ‰์…˜ ์ค‘์‹ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

  1. ์ˆ˜์ง‘ํ•˜๊ธฐ - map, values, pluck ๋“ฑ
  2. ๊ฑฐ๋ฅด๊ธฐ - filter, reject, compact ๋“ฑ
  3. ์ฐพ์•„๋‚ด๊ธฐ- find, find_index, some, every
  4. ์ ‘๊ธฐ - reduce, min_by, max_by, group_by, count_by, ์กฐํ•ฉ

๊ฐ ์œ ํ˜•์˜ ๋Œ€ํ‘œํ•จ์ˆ˜

map filter find reduce

์–˜๋„ค๊ฐ€ ๊ฐ€์žฅ ์ถ”์ƒํ™” ๋ ˆ๋ฒจ์ด ๋†’๊ณ 
๋Œ€ํ‘œํ•จ์ˆ˜ ๊ฐ€์ง€๊ณ  ๊ฐ ์œ ํ˜•์˜ ํŠนํ™”ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

๊ฐ€๊ณตํ•  ๋ฐ์ดํ„ฐ

var users = [
    { id: 11, name: "๋ฉ", age: 20 },
    { id: 22, name: "๋ƒฅ", age: 22 },   
    { id: 33, name: "์งน", age: 27 },
    { id: 44, name: "๊ฝฅ", age: 30 }
];

๐Ÿ”ธ 1. ์ˆ˜์ง‘ํ•˜๊ธฐ - map, values, pluck

๐Ÿ”ทmap

_map(users, user=>user.name);

๐Ÿ™„ _identity

function _identity(val) {
    return val;
}

์–œ ์–ด๋”ฐ ์“ฐ๋Š”๊ฑฐ์ž„?

๊ฑ ๋“ค์–ด์˜จ๊ฐ’ ๊ทธ๋Œ€๋กœ ๋‚ด๋ฑ‰๋Š”๊ฑด๋ฐ? values ํ•จ์ˆ˜๋ฅผ ๋ณด๋ฉด๋จ

๐Ÿ”น values
function _values(data){
    return _map(data, val=>val);
}

function _values(data){
    return _map(data,  _identity);
}

values ์˜ mapper ๋ณด์กฐํ•จ์ˆ˜๋ฅผ _identity ๋กœ ํ–ˆ๊ธฐ๋•Œ๋ฌธ์—

๊ฐ’๋“ค๋งŒ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ์Œ

์ด๋Ÿฐ์‹์œผ๋กœ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์ด๋ž‘ ์กฐํ•ฉํ•ด์„œ ์“ฐ๋ ค๊ณ  ์žˆ๋Š”๊ฑฐ์ž„

์‹คํ–‰ ๊ฒฐ๊ณผ

console.log(users[0]);      // { id: 11, name: '๋ฉ', age: 20 }
console.log(_keys(users[0]));   // [ 'id', 'name', 'age' ]
console.log(_values(users[0])); // [ 11, '๋ฉ', 20 ]
๐Ÿ”น pluck

ํŠน์ • ํ‚ค๊ฐ’๋“ค๋งŒ ์‹น ๋ชจ์Œ

function _pluck(data, key) {
    return _map(data, obj => obj[key]);
}

์‹คํ–‰ ๊ฒฐ๊ณผ

console.log(_pluck(users, 'age')); // [ 20, 22, 27, 30 ]
console.log(_pluck(users, 'name')); // [ '๋ฉ', '๋ƒฅ', '์งน', '๊ฝฅ' ]

๐Ÿ”ธ 2. ๊ฑฐ๋ฅด๊ธฐ - filter, reject, compact

๐Ÿ”ทfilter

_filter(list, predi)

๐Ÿ”น reject

predi(val)์ด false ์ธ ๊ฒƒ๋งŒ ๊ฑฐ๋ฅด๊ธฐ

function _reject(data, predi) {
    return _filter( data, val => !predi(val) );
}

์ € predi ๊ฒฐ๊ณผ ๋’ค์ง‘๋Š”๊ฒƒ๋„ ๋ชจ๋“ˆํ™”ํ• ์ˆ˜์žˆ์Œ

_negate(func)

function _negate(func){
    return !func(val);
}
๐Ÿ”น compact

truthy ์ฐพ๋Š”๊ฑฐ

var _compact = _filter(_identity);

filter ์˜ predi ๋ฅผ identity ๋กœ ํ•œ๋‹ค

๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๋„ฃ์–ด์„œ if(๊ฐ’) ์ด true ์ผ๋•Œ๋งŒ push

์‹คํ–‰ ๊ฒฐ๊ณผ

console.log(_compact([1, 2, 0, false, null, {}, "", "a"])); 
// [ 1, 2, {}, 'a' ]

๐Ÿ”ธ 3. ์ฐพ์•„๋‚ด๊ธฐ- find, find_index, some, every

๐Ÿ”ทfind

var _find = _curryr(function(list, predi) {
  var keys = _keys(list);
  for (var i = 0, len = keys.length; i < len; i++) {
    var val = list[keys[i]];
    if (predi(val)) return val;
  }
});

predi๋ฅผ ๋งŒ์กฑํ•˜๋Š” ์• ๋ฅผ ์ฒ˜์Œ ๋งŒ๋‚˜๋ฉด ๋ฐ”๋กœ ๋ฑ‰์Œ return val;

์‚ฌ์šฉ ์˜ˆ) id ๋‚˜ ์ด๋ฆ„์ด ์ผ์น˜ํ•˜๋Š” ์•  ํ•˜๋‚˜๋ฅผ ์ฐพ์„ ๋•Œ

console.log(_find(users, user=>user.name === "๋ฉ"));
// { id: 11, name: '๋ฉ', age: 20 }
๐Ÿ”น find_index
var _find_index = _curryr(function(list, predi) {
  var keys = _keys(list);
  for (var i = 0, len = keys.length; i < len; i++) {
    if (predi(list[keys[i]])) return i;
  }
  return -1;
});

predi๋ฅผ ๋งŒ์กฑํ•˜๋Š” ์• ๋ฅผ ์ฒ˜์Œ ๋งŒ๋‚˜๋ฉด ๊ทธ ์ธ๋ฑ์Šค๋ฅผ ๋ฑ‰์Œ return val;

์‹คํ–‰ ๊ฒฐ๊ณผ

log(_find_index(users, user => user.name === "์งน"));    // 2
log(_find_index(users, user => user.name === "์œ™"));    // -1

์กฐํ•ฉํ•ด์„œ ์จ๋ณด๊ธฐ

_go(users,
    // users ์ค‘์—์„œ id ๊ฐ€ 11์ธ์•  ๊ฑฐ๋ฆ„
    _find(user => user.id === 11),
    // ๊ฑ”์˜ key๊ฐ€ name์ธ๊ฐ€๊ฑฐ๊ฐ€์ ธ์˜ด
    _get("name"),
    // ์ถœ๋ ฅํ•จ
    console.log
)   // ๋ฉ
๐Ÿ”น some

predi ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์• ๋ฅผ ์ฐพ๋Š”๋ฐ

๊ทธ๊ฒŒ ํ•˜๋‚˜๋ผ๋„ ์ž‡์œผ๋ฉด true

function _some(data, predi){
    return _find_index(data, predi) !== -1;
}

find index ๊ฐ€ -1 ๋งŒ ์•„๋‹ˆ๋ฉด๋จ

๐Ÿ”น every

every๋Š” ๊ทธ๊ฑธ ์ฃ„~~๋‹ค ๋งŒ์กฑํ•ด์•ผ์ง€๋งŒ true

function every(data, predi) {
    return _find_index(data, _negate(predi)) !== -1;
}

    // return _find_index(data, val => !predi(val)) !== -1;

predi ์— ๊ฐ’์„ ๋„ฃ์—ˆ๋Š”๋ฐ false ๊ฐ€ ๋‚˜์˜ค๋Š” ์• ๊ฐ€ ์žˆ๋Š”์ง€ ์ฐพ๊ธฐ

์•„๋ฌด๊ฒƒ๋„ ๋ชป์ฐพ์œผ๋ฉด ๋ชจ๋‘ true ์ž„

์‘์šฉ

console.log(_some([null, false, "", 0], _identity));    // false
console.log(_some([null, false, "", 0, 1], _identity)); // true
console.log(_every([1, true, "a"], _identity));         // true

_find_index(data, predi || _identity) != -1;

ํ˜•ํƒœ๋กœ ๋ฐ”๊พธ๋ฉด

predi ๊ฐ€ ์—†์„๋•Œ _identify ๋กœ ์ž‘๋™ํ•จ

์‚ฌ์šฉ์˜ˆ

console.log(
    _some(users, user => user.age < 30)
);  // true


console.log(
    _every(users, user => user.age >= 20)
);  // true

๐Ÿ”ธ 4. ์ ‘๊ธฐ - reduce, min_by, max_by, group_by, count_by, ์กฐํ•ฉ

๐Ÿ”ทreduce

find ์™€ ๋‹ค๋ฅธ ์ ์€ ํ•˜๋‚˜๋งŒ ์ฐพ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ ๋ชจ๋‘ ํƒ์ƒ‰ํ•จ

ํ‰๊ฐ€ ์ˆœ์„œ์™€ ๊ด€๊ณ„์—†์ด ๊ฐ™์€ ๊ฐ’์„ ๋‚ด๋ฑ‰๋„๋ก ํ”„๋กœ๊ทธ๋ž˜๋ฐํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•จ

[1, 2, 3] ์ด๋ ‡๊ฒŒ ๋“ค์–ด์˜ค๋‚˜ [3, 2, 1] ์ด๋ ‡๊ฒŒ ๋“ค์–ด์˜ค๋‚˜ ๊ฐ™์€ ๊ฐ’์„ ๋ฑ‰์–ด์•ผํ•จ!

reduce๋ฅผ ๋‹จ์ˆœํžˆ for๋ฌธ์„ ๋Œ€์ฒดํ•˜๋Š” ์‹์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ

๐Ÿ”น min
_min([1, 2, 3, 4, 10, 5, -4]);    // -4

function _min(data){
    return _reduce(data, function(a,b) {
        return a < b ? a : b;    // ๋‘˜ ์ค‘ ์ž‘์€ ๊ฐ’์„ ๋ฑ‰๋Š”๋‹ค
    });
}
๐Ÿ”น max
_max([1, 2, 3, 4, 10, 5, -4]);    // 10

function _max(data){
    return _reduce(data, function(a,b) {
        return a > b ? a : b;    // ๋‘˜ ์ค‘ ์ž‘์€ ๊ฐ’์„ ๋ฑ‰๋Š”๋‹ค
    });
}
๐Ÿ”น min_by, max_by

๋ณด์กฐํ•จ์ˆ˜๋ฅผ ๋ฐ›์•„์„œ ๊ฐ’์„ ๊ฐ€๊ณตํ•œ ์ดํ›„์— min ๊ฐ’์„ ๊ตฌํ•˜์ง€๋งŒ

return๊ฐ’์€ ์›๋ณธ๊ฐ’์ž„ (์›๋ณธ ๋ฐฐ์—ด ๋˜ํ•œ ๋ณ€ํ•˜์ง€ ์•Š์Œ)

_min_by([1, 2, 3, 4, 10, 5, -4], Math.abs);

function _min_by(data, iter) {
    return _reduce(data, function (a, b) {
        return iter(a) < iter(b) ? a : b;
    })
}


function _max_by(data, iter) {
    return _reduce(data, function (a, b) {
        return iter(a) > iter(b) ? a : b;
    })
}
๐Ÿ”น group_by
function _push(obj, key, val) {
    (obj[key] = obj[key] || []).push(val);
    return obj;
}

var _group_by = _curryr(function (data, iter) {
    return _reduce(data, function (grouped, val) {
        return _push(grouped, iter(val), val);
    }, {});
});
๐Ÿ”น count_by
var _inc = function (count, val) {
    var key = iter(val);
    count[key] ? count[key]++ : count[key] = 1;
    return count
}

var _count_by = _curryr(function (data, iter) {
    return _reduce(data, function (count, val) {
        return _inc(count, iter(val));
    });
});
๋Œ“๊ธ€