教学目标
熟悉JavaScript的基本语法;
熟悉JavaScript的基本逻辑语句及关键字;
熟悉使用Lo-Dash和moment.js等第三方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)功能。
function 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; _.map(inputs,function(i) { item_barcode=i; inputs=i.length==10?barcode_list.push(item_barcode):barcode_list.push((i.substr(0,10)),(i.substr(0,10))); }); _.map(barcode_list,function(j) { _.map(allItems,function(k) { item=k; if(k.barcode==j) { cart_list.push(item); } }); }); _.map(cart_list,function(l){ item=l; if(item_list.length===0) { item.count=1; item_list.push(item); } else{ for(var m=0;m<item_list.length;m++){ if(l==item_list[m]) { item.count++; } else if(m==item_list.length-1) { item_list.push(item); item.count=0; } } } }); _.map(item_list,function(n) { if(n.count>=3) { Promotion+='\n'+'名称:'+n.name+','+'数量:'+parseInt(n.count/3)+n.unit; save+=parseInt(n.count/3)*n.price; } list=list+'\n'+'名称:'+n.name+','+'数量:'+n.count+n.unit+','+'单价:'+n.price.toFixed(2)+'(元)'+','+'小计:'+((n.count-parseInt(n.count/3))*n.price).toFixed(2)+'(元)'; sum+=(n.count-parseInt(n.count/3))*n.price; }); dateDigitToString = function (num) { return num < 10 ? '0' + num : num; }; var currentDate = new Date(), year = dateDigitToString(currentDate.getFullYear()), month = dateDigitToString(currentDate.getMonth() + 1), date = dateDigitToString(currentDate.getDate()), hour = dateDigitToString(currentDate.getHours()), minute = dateDigitToString(currentDate.getMinutes()), second = dateDigitToString(currentDate.getSeconds()), formattedDateString = year + '年' + month + '月' + date + '日 ' + hour + ':' + minute + ':' + second; list='***<没钱赚商店>购物清单***'+'\n'+'打印时间:'+ formattedDateString+'\n'+'----------------------' +list+'\n'+'----------------------'+'\n'+'挥泪赠送商品:'+Promotion+'\n'+'----------------------'+'\n'+'总计:'+sum.toFixed(2)+'(元)'+'\n'+'节省:'+save.toFixed(2)+'(元)'+'\n'+'**********************'; console.log(list); }
POS收银机 v1.1此题运用了: 1 for循环遍历数组;
2 对象中键所对应的值;
3 拼接字符串;
4 if else 语句;
5 数组的添加 用push;
6 substr截取字符串;
7 parseint所求的商为整数;
8 toFixed()把 Number 四舍五入为指定小数位数的数字;
9 调用函数dateDigitToString的方法;
10 时间格式的转换;
11 用了Lo-Dash;
_.map()代替for循环语句
_.map(item_list,function(n){ n++; }); 等价于for(var n =0; n<item_list.length;n++){ n++;
代替if..if
var a;
if(activities.length){
a = 1;
}
if(!activities.legth){
a = 0;
}
替换以后
var a = activities.length ? 1 : 0;