## JavaScript - Cash Register

Design a cash register drawer function checkCashRegister() that accepts purchase price as the first argument (price), payment as the second argument (cash), and cash-in-drawer (cid) as the third argument.
cid is a 2D array listing available currency.
The checkCashRegister() function should always return an object with a status key and a change key.
Return { status: "INSUFFICIENT_FUNDS", change: [] } if cash -in -drawer is less than the change due, or if you cannot return the exact change.
Return { status: "CLOSED", change: [...] } with cash -in -drawer as the value for the key change if it is equal to the change due.
Otherwise, return { status: "OPEN", change: [...] }, with the change due in coins and bills, sorted in highest to lowest order, as the value of the change key.
Currency Unit Amount

Penny \$0.01(PENNY)
Nickel \$0.05(NICKEL)
Dime \$0.1(DIME)
Quarter \$0.25(QUARTER)
Dollar \$1(ONE)
Five Dollars \$5(FIVE)
Ten Dollars \$10(TEN)
Twenty Dollars \$20(TWENTY)
One - hundred Dollars \$100(ONE HUNDRED)

See below for an example of a cash -in -drawer array:
[
["PENNY", 1.01],
["NICKEL", 2.05],
["DIME", 3.1],
["QUARTER", 4.25],
["ONE", 90],
["FIVE", 55],
["TEN", 20],
["TWENTY", 60],
["ONE HUNDRED", 100]

`//Solutions //Create an array of objects which hold the denominations and their valuesvar denom = [    { name: "ONE HUNDRED", val: 100.0 },    { name: "TWENTY", val: 20.0 },    { name: "TEN", val: 10.0 },    { name: "FIVE", val: 5.0 },    { name: "ONE", val: 1.0 },    { name: "QUARTER", val: 0.25 },    { name: "DIME", val: 0.1 },    { name: "NICKEL", val: 0.05 },    { name: "PENNY", val: 0.01 }];function checkCashRegister(price, cash, cid) {    var output = { status: null, change: [] };    var change = cash - price;    //Transform CID array into drawer object    var register = cid.reduce(        function (acc, curr) {            acc.total += curr;            acc[curr] = curr;            return acc;        },        { total: 0 }    );    //Handle exact change    if (register.total === change) {        output.status = "CLOSED";        output.change = cid;        return output;    }    //Handle obvious insufficient funds    if (register.total < change) {        output.status = "INSUFFICIENT_FUNDS";        return output;    }    //Loop through the denomination array    var change_arr = denom.reduce(function (acc, curr) {        var value = 0;        //While there is still money of this type in the drawer        //And while the denomination is larger than the change remaining        while (register[curr.name] > 0 && change >= curr.val) {            change -= curr.val;            register[curr.name] -= curr.val;            value += curr.val;            //Round change to the nearest hundreth deals with precision errors            change = Math.round(change * 100) / 100;        }        //Add this denomination to the output only if any was used.        if (value > 0) {            acc.push([curr.name, value]);        }        return acc;   Return the current change_arr    }, []);   Initial value of empty array for reduce    //If there are no elements in change_arr or we have leftover change, return    //the string "Insufficient Funds"    if (change_arr.length < 1 || change > 0) {        output.status = "INSUFFICIENT_FUNDS";        return output;    }    //Here is your change, ma'am.    output.status = "OPEN";    output.change = change_arr;    return output;}console.log(checkCashRegister(19.5, 20, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]]));`