ํฐ์คํ ๋ฆฌ ๋ทฐ
[๊ฐ์๋ ธํธ] ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์์๋ณด๋ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ 2
Carrot๐ฅ 2020. 8. 5. 22:16** โ priv | ๊ฐ์๋
ธํธ
์นดํ
๊ณ ๋ฆฌ์ ์๋ ๋ด์ฉ์ ๋ฐํ์ด ๋ชฉ์ ์ด ์๋๊ธฐ ๋๋ฌธ์ ์ ํ ์ ์ ๋์ด์์ง ์์ต๋๋น.**
๐ ์ปฌ๋ ์ ์ค์ฌ ํ๋ก๊ทธ๋๋ฐ
- ์์งํ๊ธฐ - map, values, pluck ๋ฑ
- ๊ฑฐ๋ฅด๊ธฐ - filter, reject, compact ๋ฑ
- ์ฐพ์๋ด๊ธฐ- find, find_index, some, every
- ์ ๊ธฐ - 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));
});
});
'๊ณต๋ถ > priv | ๊ฐ์๋ ธํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
- review
- KEYBOARD
- VSC
- array
- string
- css
- js
- eventlistener
- ๋ฐ๋๋ผ์ฝ๋ฉ ํ๊ธฐ
- ์์ฑ์ํจ์
- stackoverflow
- eslint
- ๋ฐ๋๋ผ์ฝ๋ฉ
- ์ฝ๋ฉ๋ถํธ์บ ํ
- Stash
- GIT
- DOM
- ๋ถํธ์บ ํ
- book
- HTML
- Total
- Today
- Yesterday