商店里进行购物结算时会使用收银机(POS)系统,这台收银机会在结算时根据客户的购物车(Cart)中的商品(Item)进行结算和打印购物清单。
我们需要实现一个名为printInventory
函数,该函数能够将指定格式的数据作为参数输入,然后在浏览器的控制台中输出结算清单的文本。
输入格式(样例):
[
'ITEM000000',
'ITEM000000',
'ITEM000000',
'ITEM000000',
'ITEM000000',
'ITEM000001',
'ITEM000001',
'ITEM000004'
]
(当点击"保存并提交代码"按钮的时候,我们会调用函数printInventory将上面的数据作为参数(inputs)传入该函数。)
清单内容(样例):
***<没钱赚商店>购物清单***
名称:可口可乐,数量:5瓶,单价:3.00(元),小计:15.00(元)
名称:雪碧,数量:2瓶,单价:3.00(元),小计:6.00(元)
名称:电池,数量:1个,单价:2.00(元),小计:2.00(元)
----------------------
总计:23.00(元)
**********************
function loadAllItems() { return [ { barcode: 'ITEM000000', name: '可口可乐', unit: '瓶', price: 3.00 }, { barcode: 'ITEM000001', name: '雪碧', unit: '瓶', price: 3.00 }, { barcode: 'ITEM000002', name: '苹果', unit: '斤', price: 5.50 }, { barcode: 'ITEM000003', name: '荔枝', unit: '斤', price: 15.00 }, { barcode: 'ITEM000004', name: '电池', unit: '个', price: 2.00 }, { barcode: 'ITEM000005', name: '方便面', unit: '袋', price: 4.50 } ]; }
describe('practice-1-3', function () { var allItems; var inputs; beforeEach(function () { allItems = loadAllItems(); inputs = [ 'ITEM000000', 'ITEM000000', 'ITEM000000', 'ITEM000000', 'ITEM000000', 'ITEM000001', 'ITEM000001', 'ITEM000004' ]; }); it('should print correct text', function () { printInventory(inputs); var expectText = '***<没钱赚商店>购物清单***\n' + '名称:可口可乐,数量:5瓶,单价:3.00(元),小计:15.00(元)\n' + '名称:雪碧,数量:2瓶,单价:3.00(元),小计:6.00(元)\n' + '名称:电池,数量:1个,单价:2.00(元),小计:2.00(元)\n' + '----------------------\n' + '总计:23.00(元)\n' + '**********************'; expect(logs[0]).toBe(expectText); }); });
答案:
1)定义求和变量sum、count、item,并赋值sum、count为零;定义数组cart_list和item_list存放商品信息:
var sum=0; var cart_list=[]; var item; var item_list=[]; var count=0;
2)把loadAllItems()函数赋给变量allItems:
var allItems=loadAllItems();
3)遍历inputs数组,再遍历allitems,然后判断它们的barcode是否相等,把参数allitem放到数组cart_list中:
inputs.forEach(function(input){ allItems.forEach(function(allitem){ if(allitem.barcode == input) { cart_list.push(allitem); } }) })
4) 遍历car_list数组,把carts赋值给item,再判断数组长度是否为零:
cart_list.forEach(function(carts){ item=carts; if(item_list.length === 0) { }
5)如果遍历的参数的barcode在item数组里有,则把该参数的数量加1,然后跳出本次循环:
if(items.barcode == item.barcode) { items.count++; return; }
6)判断是否已经遍历到最后一个对象了,如果数组里面没存有该对象,则把该参数放到数组里,并赋值为1:
else if(index == item_list.length-1) //判断是否已遍历到最后一个对象 { item.count=1; item_list.push(item); }
7)最后遍历数组item_list,循环遍历输出,再计算商品的总价格,并且打印输出结果:
item_list.forEach(function(allitems){ list=list+'\n'+'名称:'+allitems.name+',数量:'+allitems.count+allitems.unit+',单价:'+allitems.price+'.00(元)'+',小计:'+allitems.count*allitems.price+'.00(元)'; sum += allitems.count*allitems.price; //计算总价格 }) console.log(list+'\n'+'----------------------'+'\n'+'总计:'+sum+'.00(元)'+'\n'+'**********************');