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
{
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)功能。
f
unction printInventory(inputs) { var item; var list='***<没钱赚商店>购物清单***'; var sum=0; var item_list=[]; var cart_list=[]; var barcode_list=[]; var allItems = loadAllItems(); var item_barcode; var Promotion='挥泪赠送商品:'; var save=0; for(var i=0;i<inputs.length;i++){ item_barcode=inputs[i]; if(inputs[i].length == 10){ barcode_list.push(item_barcode); } else{ item_barcode=inputs[i].substr(0,10); barcode_list.push(item_barcode); barcode_list.push(item_barcode); } } for(var j=0;j<barcode_list.length;j++) { for(var k=0;k<allItems.length;k++){ item=allItems[k]; if(allItems[k].barcode==barcode_list[j]){ cart_list.push(item); } } } for(var l=0;l<cart_list.length;l++){ item=cart_list[l]; if(item_list.length===0){ item.count=1; item_list.push(item); } else{ for(var n=0;n<item_list.length;n++){ if(cart_list[l]==item_list[n]){ item.count++; } else if(n==item_list.length-1){ item_list.push(item); item.count=0; } } } } for(var m=0;m<item_list.length;m++) { if(item_list[m].count>=3) { Promotion+='\n'+'名称:'+item_list[m].name+','+'数量:'+parseInt(item_list[m].count/3)+item_list[m].unit; save+=parseInt(item_list[m].count/3)*item_list[m].price; } list=list+'\n'+'名称:'+item_list[m].name+','+'数量:'+item_list[m].count+item_list[m].unit+','+'单价:'+item_list[m].price.toFixed(2)+'(元)'+','+'小计:'+(item_list[m].count-parseInt(item_list[m].count/3))*item_list[m].price+'.00(元)'; sum+=(item_list[m].count-parseInt(item_list[m].count/3))*item_list[m].price; } list=list+'\n'+'----------------------'+'\n'+Promotion+'\n'+'----------------------'+'\n'+'总计:'+sum.toFixed(2)+'(元)'+'\n'+'节省:'+save.toFixed(2)+'(元)'+'\n'+'**********************'; console.log(list);
}
POS收银机 v1此题运用了: 1 for循环遍历数组;
2 对象中键所对应的值;
3 拼接字符串;
4 if else 语句;
5 数组的添加 用push;
6 substr截取字符串;
7 parseint所求的商为整数;
8 toFixed()把 Number 四舍五入为指定小数位数的数字
substr() 方法可在字符串中抽取从 start 下标开始的指定数目的字符。
语法
stringObject.substr(start,length)
参数 描述
start 必需。要抽取的子串的起始下标。必须是数值。如果是负数,那么该参数声明从字符串的尾部开始算起的位置。也就是说,-1 指字符串中最后一个字符,-2
倒数第二个字符,以此类推。
length 可选。子串中的字符数。必须是数值。如果省略了该参数,那么返回从 stringObject 的开始位置到结尾的字串。
返回值
一个新的字符串,包含从 stringObject 的 start(包括 start 所指的字符) 处开始的 length 个字符。如果没有指定 length,那么返回的字符串包含从 start 到 stringObject 的结尾的字符。
例子 1: ar str="Hello world!" console.log(str.substr(3)) 输出: lo world!
例子 2 : var str="Hello world!" console.log(str.substr(3,7)) 输出: lo worl
parseint()方法
例子: console.log(parseInt(10/3)); 输出: 3
JavaScript toFixed() 方法
定义和用法
toFixed() 方法可把 Number 四舍五入为指定小数位数的数字。
语法
NumberObject.toFixed(num)
参数 描述
num 必需。规定小数的位数,是 0 ~ 20 之间的值,包括 0 和 20,有些实现可以支持更大的数值范围。如果省略了该参数,将用 0 代替。
返回值
返回 NumberObject 的字符串表示,不采用指数计数法,小数点后有固定的 num 位数字。如果必要,该数字会被舍入,也可以用 0 补足,以便它达到指定的长度。如果 num 大于 le+21,则该方法只调用 NumberObject.toString(),返回采用指数计数法表示的字符串。
抛出
当 num 太小或太大时抛出异常 RangeError。0 ~ 20 之间的值不会引发该异常。有些实现支持更大范围或更小范围内的值。
当调用该方法的对象不是 Number 时抛出 TypeError 异常。
实例
在本例中,我们将把数字舍入为仅有一位小数的数字:
var num = new Number(13.37); console.log (num.toFixed(1)); console.log (num.toFixed(2)); 输出: 13.37 13.4