js
filter를 이용해, reject, compact 함수 구현
mallang_col
2024. 7. 7. 17:00
filter 함수의 경우, 특정 어레이에, 내가 predict한 함수가 트루 값을 반환하면 이 값만 남겨주는 함수이다.
결국, 앞에서 했던 map과 같은 수집하기와는 다르게, 거르는 역할을 하게 된다.
이를 코드로 구현해보면
function _filter(obj, predicate) {
const result = [];
const keys = _keys(obj);
for (let i = 0, len = keys.length; i < len; ++i) {
const key = keys[i];
if (predicate(obj[key])) {
result.push(obj[key]);
}
}
return result
}
위의 코드를 보면 이전의 코드에서 중복되는 로직이 반복되는것을 확인 할 수 있었다.
이를 추상화 하여 처리한뒤, false 한 값만 반환하도록 하는 로직을 가지는 reject함수와, truthy한 값만 남겨주는 compact 함수를 구현해보자.
여기서
for 부분이 공통되기에 이를 _each라는 함수로 만들고 이를 이용한 코드로 정리하면,
function _each(obj, iter) {
const keys = _keys(obj);
for (let i = 0, len = keys.length; i < len; ++i) {
iter(obj[keys[i]]);
}
return obj;
}
function _re_filter(obj, predicate) {
const result = [];
_each(obj, function(val) {
predicate(val) && result.push(val);
})
return result;
}
function _reject(obj, predicate) {
return _re_filter(obj, function(val) {
return !predicate(val);
})
}
function _compact(obj) {
return _re_filter(obj, _identity)
}
간단한 코드 로직으로 구현할 수 있다.