Untitled

여러 단계를 하나로 엮은 체인chain으로 복합적인 계산을 표현하는 방법

체이닝

Untitled

단계들을 조합해 하나의 쿼리로 만들자. 이렇게 여러 단계를 하나로 조합하는 것을 체이닝이라 한다.

  1. 우수 고객(3개 이상 구매)을 거른다: filter
  2. 우수 고객을 가장 비싼 구매로 바꾼다: map
function biggestPurchasesBestCustomers(customers) {
    var bestCustomers = filter(customers, function(customer) {
        return customer.purchases.length >= 3;
    });

    var biggestPurchases = map(bestCustomers, function(customer) {
        return reduce(customer.purchases, { total: 0 }, function(biggestSoFar, purchase) {
            if(biggestSoFar.total > purchase.total)
                return biggestSoFar;
            else
                return purchase;
        });
    });

    return biggestPurchases;
}

콜백이 중첩되어 읽기가 어렵다.

가장 비싼 구매를 찾는 코드를 콜백으로 분리해보자.

reduce(customer.purchases, { total: 0 }, function(biggestSoFar, purchase) {
    if(biggestSoFar.total > purchase.total)
        return biggestSoFar;
    else
        return purchase;
});
maxKey(customer.purchases, { total: 0 }, function(purchase) {
	return purchase.total;
});

function maxKey(array, init, f) {
    return reduce(array, init, function(biggestSoFar, purchase) {
            if(f(biggestSoFar) > f(purchase))
                return biggestSoFar;
            else
                return purchase;
        });
}

maxKey() 함수를 만들었으니 사용해 보자.

function biggestPurchasesBestCustomers(customers) {
    var bestCustomers = filter(customers, function(customer) {
        return customer.purchases.length >= 3;
    });

    var biggestPurchases = map(bestCustomers, function(customer) {
        return maxKey(customer.purchases, { total: 0 }, function(purchase) {
            return purchase.total;
        });
    });

    return biggestPurchases;
}

연습 문제

Untitled