【问题标题】:Typescript - Check item with condition打字稿 - 检查有条件的项目
【发布时间】:2018-09-29 23:13:18
【问题描述】:

我有一个客户列表,每个客户都有一个 ID、一个名称和项目。商品中有价格和折扣。

我想知道的是所有用户最终花费的金额,但仅限于有折扣的商品。所以,所有商品都有折扣,然后是价格 - 折扣。

有没有办法用 ES5/ES6 做到这一点?因为我可以用 vanilla JS 做到这一点,但不是很干净。

代码如下:

 let clients: { id: number, name: string, items: { price: number, disc:
 number }[] }[];  

 clients = [  
        {id: 0,  
               name: 'John',  
               items: [{  
             price: 120,  
             disc: 30  
         },{  
             price: 200,  
             disc: 50   
         }]  
     },  
     {  
         id: 0,  
         name: 'Doe',  
         items: [{  
             price: 135,  
             disc: 0  
         }]  
     },  
     {  
         id: 0,  
         name: 'Matt',  
         items: [{  
             price: 150,  
             disc: 10  
         }]  
     },   ]

【问题讨论】:

    标签: javascript typescript ecmascript-6 ecmascript-5


    【解决方案1】:

    不确定您是否要计算总数,但这会对您有所帮助:

    过滤商品并计算折扣价格:

     let clientsWithFilteredItems = clients.map(c => ({ 
        id: c.id,
        name: c.name,
        items: c.items.filter(i => i.disc > 0).map(i => ({ 
                priceWithDiscount: i.price - i.disc
            })),
    }));
    
    
    let clientsWithTotalDiscountedPricePaid = clients.map(c => ({ 
        id: c.id,
        name: c.name,
        totalDiscountedPrice: c.items.filter(i => i.disc > 0).reduce((total, x) => total + x.price - x.disc, 0),
    }));
    

    可执行的sn-p:

       
     let clients = [  
            {id: 0,  
                   name: 'John',  
                   items: [{  
                 price: 120,  
                 disc: 30  
             },{  
                 price: 200,  
                 disc: 50   
             }]  
         },  
         {  
             id: 0,  
             name: 'Doe',  
             items: [{  
                 price: 135,  
                 disc: 0  
             }]  
         },  
         {  
             id: 0,  
             name: 'Matt',  
             items: [{  
                 price: 150,  
                 disc: 10  
             }]  
         },   ]
         
         let clientsWithFilteredItems = clients.map(c => ({ 
            id: c.id,
            name: c.name,
            items: c.items.filter(i => i.disc > 0).map(i => ({ 
                    priceWithDiscount: i.price - i.disc
                })),
        }));
    
        
        let clientsWithTotalDiscountedPricePaid = clients.map(c => ({ 
            id: c.id,
            name: c.name,
            totalDiscountedPrice: c.items.filter(i => i.disc > 0).reduce((total, x) => total + x.price - x.disc, 0),
        }));
    
         console.log(clientsWithFilteredItems);
         
         console.log(clientsWithTotalDiscountedPricePaid);

    【讨论】:

      【解决方案2】:

      如果我对问题的理解正确,您需要所有有折扣的用户的所有商品的总和:

       let sum = clients
          .reduce<{ price: number, disc: number }[]>((s, x) => s.concat(x.items), []) // flatten the item arrays
          .filter(i=> i.disc > 0) // filter
          .reduce((s, i)=> s + (i.price - i.disc), 0) // sum
      

      或者如果您想要客户的项目:

       let sum = clients
          .map(c=> (
          {
              id: c.id,
              name: c.name,
              sumItems: c.items.filter(i=> i.disc > 0).reduce((s, x)=> s+ x.price - x.disc, 0)
          }));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-07-20
        • 2019-10-07
        • 2019-09-22
        • 2018-11-03
        • 2019-05-03
        • 2020-08-14
        • 2017-05-08
        • 2021-04-26
        相关资源
        最近更新 更多