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)
}

간단한 코드 로직으로 구현할 수 있다.

 

댓글수0