POS Project v1
POS收银机 版本:v1
教学目标
- 熟悉JavaScript的基本语法;
- 熟悉JavaScript的基本逻辑语句及关键字;
需求描述
商店里进行购物结算时会使用收银机(POS)系统,这台收银机会在结算时根据客户的购物车(Cart)中的商品(Item)和商店正在进行的优惠活动(Promotion)进行结算和打印购物清单。
已知该商店正在对部分商品进行“买三送一”的优惠活动,即买三件商品其中一件是送的,按照两件商品价格结算。
我们需要实现一个名为printInventory
函数,该函数能够将指定格式的数据作为参数输入,然后在浏览器的控制台中输出结算清单的文本。
输入格式(样例):
javascript
[
'ITEM000001',
'ITEM000001',
'ITEM000001',
'ITEM000001',
'ITEM000001',
'ITEM000003-2',
'ITEM000005',
'ITEM000005',
'ITEM000005'
]
其中对'ITEM000003-2'来说,"-"之前的是标准的条形码,"-"之后的是数量。 当我们购买需要称量的物品的时候,由称量的机器生成此类条形码,收银机负责识别生成小票。 (当点击"保存并提交代码"按钮的时候,我们会调用函数printInventory将上面的数据作为参数(inputs)传入该函数。)
清单内容(样例):
***<没钱赚商店>购物清单***
名称:可口可乐,数量:3瓶,单价:3.00(元),小计:6.00(元)
名称:羽毛球,数量:5个,单价:1.00(元),小计:4.00(元)
名称:苹果,数量:2斤,单价:5.50(元),小计:11.00(元)
----------------------
挥泪赠送商品:
名称:可口可乐,数量:1瓶
名称:羽毛球,数量:1个
----------------------
总计:21.00(元)
节省:4.00(元)
**********************
作业要求
- 在
main.js
文件中编写实现代码并确保测试通过; - 请在保证代码可读性的前提下,尽可能用最少的代码行数完成作业; 注意:所有的标点符号均为英文符号
作业提示
-
可使用
loadAllItems()
方法获取全部的商品,该方法返回结果为一个包含了商品对象的数组(样例):[ item1, item2, item3, ..., itemN ]
-
每一个商品对象的结构如下(样例):
javascript
扫描二维码关注公众号,回复: 599520 查看本文章{ barcode: 'ITEM000000', name: '可口可乐', unit: '瓶', price: 3.00 }
-
可使用
loadPromotions()
方法获取全部的促销信息,该方法返回结果为一个包含有促销信息对象的数组(样例):javascript
[ { type: 'BUY_TWO_GET_ONE_FREE', barcodes: [ 'ITEM000000', 'ITEM000001' ] }, { type: 'OTHER_PROMOTION', barcodes: [ 'ITEM000003', 'ITEM000004' ] } ]
-
使用console.log输出(仅允许使用一次)
- 应学习并善于使用各种流行浏览器所附带的开发人员工具中的控制台(Console)功能。
- 解题思路:给出的条形码不标准,要想办法将其拆开;连同优惠一起打印的话,加一个键值free,当期为0时不打印即可。
解题步骤:
function printInventory(inputs) { var barcode_list=get_barcode_list(inputs); var shopping_cart=get_shopping_cart(barcode_list); var list_print=get_shopping_lists(shopping_cart); console.log(list_print); } function get_barcode_list(inputs){ var barcodes={}; inputs.forEach(function(input){ if(barcodes[input]||input.indexOf('-')!=-1){ barcodes[input]++; barcodes[input.substr(0,input.indexOf('-'))]=input.substr(input.indexOf('-')+1,input.length); } else { barcodes[input]=1; } }); return barcodes } function get_shopping_cart(barcode_list){ var items=loadAllItems(); var shopping_cart=[]; items.forEach(function(item){ if(barcode_list[item.barcode]){ item.count=barcode_list[item.barcode]; item.free=Math.floor(item.count/3); shopping_cart.push(item); } }); return shopping_cart } function get_shopping_lists(shopping_cart){ var list='***<没钱赚商店>购物清单***'; var list_free='----------------------'+'\n'+'挥泪赠送商品:'; var sum=0; var save=0; shopping_cart.forEach(function(lists){ var subtotal=(lists.count-lists.free)*lists.price list=list+'\n'+'名称:'+lists.name+',数量:'+lists.count+lists.unit+',单价:'+lists.price.toFixed(2)+'(元),小计:'+subtotal.toFixed(2)+'(元)' sum+=subtotal; if(lists.free>0){ list_free=list_free+'\n'+'名称:'+lists.name+',数量:'+lists.free+lists.unit; save+=lists.free*lists.price; } }); list=list+'\n'+list_free+'\n'+'----------------------'+'\n'+'总计:'+sum.toFixed(2)+'(元)'+'\n'+'节省:'+save.toFixed(2)+'(元)'+'\n'+'**********************'; return list }
注意:命名时一定要表现其本体的真实含义,函数用动词,命名要规范。
此题中用到的知识:
(1)||或,当范围不重叠时,可以写在一段条件语句(如if)中。 if(barcodes[input]||input.indexOf('-')!=-1)
(2)indexOf()可以提取字符在字符串中的位置,当值为-1时表示字符不存在。 input.indexOf('-')!=-1
(3)substr(start,length) 方法可在字符串中抽取从 start 下标开始的指定数目的字符。 start表示抽取的起始位置,必填(第一个为0) length表示抽取的长度,当不填时为到达最后一个。
(4)toFixed()括号中为数值,表示保留小数点位数。
(5)Math.floor(item.count/3) Math.floor的作用,向下取整,如5/3得到1.