Solution a Shopping Cart

112 阅读1分钟

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:[]})
 }