3. 컬렉션 중심 프로그래밍

컬렉션은 배열과 같은 돌림직한 데이터들을 다루는 것을 의미한다.

함수형 프로그래밍에서 빛을 발하는 방식이다.

const users = [
{ id: 1, name: 'ID', age: 36 },
{ id: 2, name: 'BJ', age: 32 },
{ id: 3, name: 'JM', age: 32 },
{ id: 4, name: 'PJ', age: 27 },
{ id: 5, name: 'HA', age: 25 },
{ id: 6, name: 'JE', age: 26 },
{ id: 7, name: 'JI', age: 31 },
{ id: 8, name: 'MP', age: 23 },
];

수집하기 - map, values, pluck#

_map(users, function(user) {
return user.name;
});

거르기 - filter, reject, compact#

reject 는 필터를 반대로 동작시킨 것이라고 볼 수 있다.

filter 는 true 인 것을 갖는다.

_filter(users, function(users) {
return user.age > 30;
});

찾아내기 - find, find_index, some, every#

배열 값 중 조건이 처음으로 true 로 평가 되는 값 하나를 리턴

function _find(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;
}
return list;
}
console.log(
_find(users, function(user) {
return user;
})
); // { id: 1, name: 'ID', age: 36 }

접기 - reduce, min_by, max_by#

reduce 를 함수형 관점에서 사용하고, min_by 와 max_by 를 만들어 본다.

배열의 값 중에 젤 작은 값을 리턴
_min([1, 2, 4, 10, 5, -4]); // -4
function _min(data) {
return _reduce(data, function(a, b) {
return a < b ? a : b;
});
}
배열의 값 중에 젤 큰 값을 리턴
_max([1, 2, 4, 10, 5, -4]); // 10
function _max(data) {
return _reduce(data, function(a, b) {
return a > b ? a : b;
});
}

접기 - group_by, count_by, 조합#

expected
_group_by(users, function(user) {
return user.age;
});
var users2 = {
36: [{ id: ...}],
32: [{ id: ...}, { id: ...}, { id: ...}],
// ...
}
_group_by
var _group_by = function(data, iter) {
return _reduce(data, function(grouped, val) {
var key = iter(val);
(grouped[key] = grouped[key] || []).push(val);
return grouped;
}, {})
};
execute
_go(
users,
_group_by(function(user) {
return user.age;
}),
console.log
)
/*
{
'23': [ { id: 8, name: 'MP', age: 23 } ],
'25': [ { id: 5, name: 'HA', age: 25 } ],
'26': [ { id: 6, name: 'JE', age: 26 } ],
'27': [ { id: 4, name: 'PJ', age: 27 } ],
'31': [ { id: 7, name: 'JI', age: 31 } ],
'32': [ { id: 2, name: 'BJ', age: 32 }, { id: 3, name: 'JM', age: 32 } ],
'36': [ { id: 1, name: 'ID', age: 36 } ]
}
*/
_push 분리
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);
}, {})
});
나이대 별로 그룹화
_go(
users,
_group_by(function(user) {
return user.age - user.age % 10;
}),
console.log
);
/*
{
'20': [
{ id: 4, name: 'PJ', age: 27 },
{ id: 5, name: 'HA', age: 25 },
{ id: 6, name: 'JE', age: 26 },
{ id: 8, name: 'MP', age: 23 }
],
'30': [
{ id: 1, name: 'ID', age: 36 },
{ id: 2, name: 'BJ', age: 32 },
{ id: 3, name: 'JM', age: 32 },
{ id: 7, name: 'JI', age: 31 }
]
}
*/
성으로 그룹화
_go(
users,
_group_by(function(user) {
return user.name[0];
}),
console.log
);
var _head = function(list) {
return list[0];
}
_go(
users,
_group_by(_pipe(_get('name'), _head),
console.log
);
/*
{
I: [ { id: 1, name: 'ID', age: 36 } ],
B: [ { id: 2, name: 'BJ', age: 32 } ],
J: [
{ id: 3, name: 'JM', age: 32 },
{ id: 6, name: 'JE', age: 26 },
{ id: 7, name: 'JI', age: 31 }
],
P: [ { id: 4, name: 'PJ', age: 27 } ],
H: [ { id: 5, name: 'HA', age: 25 } ],
M: [ { id: 8, name: 'MP', age: 23 } ]
}
*/
Last updated on