여러 단계를 하나로 엮은 체인chain으로 복합적인 계산을 표현하는 방법
단계들을 조합해 하나의 쿼리로 만들자. 이렇게 여러 단계를 하나로 조합하는 것을 체이닝이라 한다.
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;
}