If anyone has the time, I’d be interested in comments on this solution to the Exact Change algorithm. I went with maps, here, but I’m not sure if that’s ideal.
var worthObj = {
"PENNY": 0.01,
"NICKEL": 0.05,
"DIME": 0.10,
"QUARTER": 0.25,
"ONE": 1.00,
"FIVE": 5.00,
"TEN": 10.00,
"TWENTY": 20.00,
"FIFTY": 50.00,
"HUNDRED": 100.00
};
function checkCashRegister(price, cash, cid) {
var change = cash - price;
var cidMap = new Map(cid.reverse());
// check for insufficient funds, etc.
var total = 0;
cidMap.forEach(function (value) {
total += value;
});
if (change > total ) {
return "Insufficient Funds";
} else if (change === total) {
return "Closed";
}
// bulk of the work.
cidMap.forEach(function (value,key,map) {
while (worthObj[key] <= change && value > 0 && change - worthObj[key] >= 0) {
value -= worthObj[key];
map.set(key, value);
change -= worthObj[key];
change = Math.round(change * 100) / 100;
}
});
// diff the map against the original cid.
var originalMap = new Map(cid.reverse());
var changeArr = [];
cidMap.forEach(function (value,key,map) {
if (map.get(key) != originalMap.get(key)) {
newValue = originalMap.get(key) - value;
newValue = Math.round(newValue * 100) / 100;
changeArr.push([key, newValue]);
}
});
// if change still needs to be accounted for,
// then we have insufficient funds.
// Otherwise, return array of change to be given
if (change > 0) {
return "Insufficient Funds";
} else {
return changeArr;
}
}
checkCashRegister(3.26, 100.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]]); // should return [["TWENTY", 60.00], ["TEN", 20.00], ["FIVE", 15.00], ["ONE", 1.00], ["QUARTER", 0.50], ["DIME", 0.20], ["PENNY", 0.04]].
Thanks!