需求描述
商店里进行购物结算时会使用收银机(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(元) **********************
解决方案:
function printInventory(inputs) { var barcodes=[]; get_barcodes_list(inputs,barcodes); var item_list = []; var allItems = loadAllItems(); get_item_list_result(item_list,barcodes,allItems) var cart_list = []; getCartListCountResult(item_list,cart_list); getCartListFreeResult(item_list,cart_list,Math); var list = getShoppingList(cart_list); console.log(list); }
一.切割inputs数组,判断有无"-"的情况,用get_barcodes对象接收,然后push到barcodes数组里面
function get_barcodes_list(inputs,barcodes) { var count=0; var get_barcodes={}; for(var j=0;j<inputs.length;j++){ if(inputs[j].indexOf('-')!=-1){ get_barcodes.count= inputs[j].substr(inputs[j].indexOf('-')+1,inputs[j].length); get_barcodes.barcode= inputs[j].substr(0,inputs[j].indexOf('-')); } else { get_barcodes.count= 1; get_barcodes.barcode=inputs[j].substr(0,inputs[j].length); } for (var m = 0; m < get_barcodes.count; m ++) { barcodes.push(get_barcodes.barcode); } } }
二.遍历barcodes数组,用allItems获取商品信息并遍历它。判断两者里面的信息是否相同,然后放到item_list数组里面。
function get_item_list_result(item_list,barcodes,allItems){ for(var i=0;i<barcodes.length;i++) { for(var k=0;k<allItems.length;k++) { if(allItems[k].barcode ==barcodes[i]) { item_list.push(allItems[k]) } } } }
三.定义数组cart_list存放商品信息;遍历数组item_list;判断item_list的长度是否为零;把参数放到数组cart_list中。
function getCartListCountResult(item_list,cart_list) { for(var m=0;m<item_list.length;m++) { if(cart_list.length==0){ item_list[m].count=1; cart_list.push(item_list[m]); } else { for(var n=0;n<cart_list.length;n++) { if(cart_list[n].barcode==item_list[m].barcode){ cart_list[n].count++; break; } else if(n==cart_list.length-1){ item_list[m].count=1; cart_list.push(item_list[m]); break; } } } }
四.遍历数组item_list,cart_list.判断里面的barcode是否相同,获得free的信息(向下取余)。
function getCartListFreeResult(item_list,cart_list,Math){ for(var m=0;m<item_list.length;m++) { for(var n=0;n<cart_list.length;n++) { var free=0; if(cart_list[n].barcode==item_list[m].barcode){ cart_list[n].free=Math.floor(cart_list[n].count/3); } } } }
五.最后遍历数组item_list,循环遍历输出,再计算商品的总价格,并且打印输出结果
function getShoppingList(cart_list) { var list = "***<没钱赚商店>购物清单***"; var list_free = "挥泪赠送商品:"; var sum = 0; var save = 0; for(var n=0;n<cart_list.length;n++){ var lists = cart_list[n]; if (cart_list[n].free > 0) { list_free = list_free+"\n"+"名称:"+cart_list[n].name+",数量:"+cart_list[n].free+cart_list[n].unit; } list = list+"\n"+"名称:"+cart_list[n].name+",数量:"+cart_list[n].count+cart_list[n].unit+",单价:"+cart_list[n].price.toFixed(2)+"(元),小计:"+((cart_list[n].count-cart_list[n].free)*cart_list[n].price).toFixed(2)+"(元)"; // list_free = list_free+"\n"+"名称:"+cart_list[n].name+",数量:"+cart_list[n].free+cart_list[n].unit; sum = sum+(cart_list[n].count-cart_list[n].free)*cart_list[n].price; save = save+cart_list[n].free*cart_list[n].price; } list = list+"\n"+"----------------------"+"\n"+list_free+"\n"+"----------------------"+"\n"+"总计:"+sum.toFixed(2)+"(元)"+"\n"+"节省:"+save.toFixed(2)+"(元)"+"\n"+"**********************"; return list }