Implement a cart feature
1. Add Items to cart;2. Add 3% tax to item in cart;
3. Buy item: cart --> purchases;
4. Empty cart;
//Amazon shopping
const user = {
name: 'Kim',
active: true,
cart: [],
purchases: []
}
function purchaseItem() {}
function addItemToCart() {}
function applyTaxToItems() {}
function buyItem() {}
function emptyItem() {}
use compose to solution it
------------------------------compose-----------------------------------------------
/*
compose:从参数的右往左执行
compose可以把类似于f(g(h(x)))这种写法简化成compose(f, g, h)(x)
先执行k=h(x)函数,然后执行j=g(k)函数,最后执行f(j)函数
*/
const compost = (f, g) => (...args) => f(g(...args));
let history = [];
purchaseItem(
emptyCart,
buyItem,
applyTaxToItems,
addItemToCart
)(user,{name: 'laptop', price: 200})
// ...fns 接收的就是所有传递进来的函数
function purchaseItem(...fns) {
//reduce只传递一个回调函数,那么N第一次默认是第一项,后续的N是上一次函数执行的处理结果
return fns.reduce(compose)
}
----------------------------------end compose----------------------------------------
----------------------------------pipe-----------------------------------------------
/*
pipe:从参数的左往右执行
pipe可以把类似于h(g(f(x)))这种写法简化成pipe(f, g, h)(x)
先执行k=f(x)函数,然后执行j=g(k)函数,最后执行h(j)函数
*/
const pipe = (f, g) => (...args) => g(f(...args));
let history = [];
purchaseItem2(
addItemToCart,
applyTaxToItems,
buyItem,
emptyCart
)(user,{name: 'laptop', price: 200})
// ...fns 接收的就是所有传递进来的函数
function purchaseItem2(...fns) {
//reduce只传递一个回调函数,那么N第一次默认是第一项,后续的N是上一次函数执行的处理结果
return fns.reduce(pipe)
}
----------------------------------end pipe-------------------------------------------
function addItemToCart(user, item) {
history.push(user);
//concat数组的合并,浅拷贝
const updateCart = user.cart.concat(item);
//assign对象的合并,浅拷贝
return Object.assign({}, user, {cart: updateCart});
}
function applyTaxToItems(user) {
history.push(user);
const {cart} = user;
const taxRate = 1.3;
const updatedCart = cart.map(item = >{
return {
name: item.name,
price: item.price*taxRate
}
})
return Object.assign({}, user, {cart: updatedCart})
}
function buyItem(user) {
history.push(user);
return Objdect.asssign({}, user, {purchases: user.cart});
}
function emptyItem(user) {
history.push(user);
return Object.assign({}, user, {cart:[]})
}