設計一個收銀程序 checkCashRegister() ,其把購買價格(price)作為第一個參數(shù) , 付款金額 (cash)作為第二個參數(shù), 和收銀機中零錢 (cid) 作為第三個參數(shù).
cid 是一個二維數(shù)組,存著當前可用的找零.
當收銀機中的錢不夠找零時返回字符串 "Insufficient Funds". 如果正好則返回字符串 "Closed".
否則, 返回應找回的零錢列表,且由大到小存在二維數(shù)組中.
var denom = [
{ name: 'ONE HUNDRED', val: 100.00},
{ name: 'TWENTY', val: 20.00},
{ name: 'TEN', val: 10.00},
{ name: 'FIVE', val: 5.00},
{ name: 'ONE', val: 1.00},
{ name: 'QUARTER', val: 0.25},
{ name: 'DIME', val: 0.10},
{ name: 'NICKEL', val: 0.05},
{ name: 'PENNY', val: 0.01}
];
function checkCashRegister(price, cash, cid) {
//需要找零的錢
var change = cash - price;
//把收銀臺的錢求和,同時轉(zhuǎn)變成一個對象
var register = cid.reduce(function(prev, curr) {
prev.total += curr[1];
prev[curr[0]] = curr[1];
return prev;
}, {total: 0});
//簡單的判斷
if (register.total === change) {
return 'Closed';
}
if (register.total < change) {
return 'Insufficient Funds';
}
// 循環(huán)我們之前定義的二維數(shù)組,并求出我們想要返回的面值數(shù)組
var change_arr = denom.reduce(function(prev, curr) {
var value = 0;
//把收銀臺里的面值從大到小的去篩選,并判斷這張面值能否找零
while (register[curr.name] > 0 && change >= curr.val) {
change -= curr.val;//滿足條件就扣除這么大的一張面值,好比總共找零60,先給一張50
register[curr.name] -= curr.val;//同時收銀臺
value += curr.val;
//熟悉的朋友知道JavaScript精度的問題,很多時候2其實是1.999999999999,所以這里處理下。
change = Math.round(change * 100) / 100;
}
// 如果value有值,就可以加入要返回的數(shù)組了,否則比較下一階的面值
if (value > 0) {
prev.push([ curr.name, value ]);
}
return prev;
}, []);
//數(shù)組里沒有值 ,或者需要找零的錢不夠
if (change_arr.length < 1 || change > 0) {
return "Insufficient Funds";
}
return change_arr;
}
// Example cash-in-drawer array:
// [["PENNY", 1.01],
// ["NICKEL", 2.05],
// ["DIME", 3.10],
// ["QUARTER", 4.25],
// ["ONE", 90.00],
// ["FIVE", 55.00],
// ["TEN", 20.00],
// ["TWENTY", 60.00],
// ["ONE HUNDRED", 100.00]]
checkCashRegister(19.50, 20.00, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.10], ["QUARTER", 4.25], ["ONE", 90.00], ["FIVE", 55.00], ["TEN", 20.00], ["TWENTY", 60.00], ["ONE HUNDRED", 100.00]]);