请编写一个用于收银机的函数 checkCashRegister():它的第一个参数为售价 price、第二个参数为领取金额 cash、第三个参数为收银机內的金额 cid。

cid 是蕴含货币面值的二维数组。

函数 checkCashRegister() 应返回含有 status 属性和 change 属性的对象。

如果收银机內的金额少于应找回的零钱数,或者你无奈返回确切的数目时,返回 {status: "INSUFFICIENT_FUNDS", change: []}。

如果收银机內的金额恰好等于应找回的零钱数,返回 {status: "CLOSED", change: [...]},其中 change 的属性值就是收银机內的金额。

否则,返回 {status: "OPEN", change: [...]},其中 change 键值是应找回的零钱数,并将找零的面值由高到低排序。

货币单位Unit面值
Penny0.01美元(PENNY)
Nickel0.05 美元(NICKEL)
Dime0.1 美元(DIME)
Quarter0.25 美元(QUARTER)
Dollar1 美元(ONE)
Five Dollars5 美元(五)
Ten Dollars10 美元(TEN)
Twenty Dollars20 美元(TWENTY)
One-hundred Dollars100美元(ONE HUNDRED)

上面的抽屉里现金数组示例:

[  ["PENNY", 1.01],  ["NICKEL", 2.05],  ["DIME", 3.1],  ["QUARTER", 4.25],  ["ONE", 90],  ["FIVE", 55],  ["TEN", 20],  ["TWENTY", 60],  ["ONE HUNDRED", 100]]

上面是测试用例:
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]]) 应返回一个对象。

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]]) 应返回 {status: "OPEN", change: [["QUARTER", 0.5]]}。

checkCashRegister(3.26, 100, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]]) 应返回 {status: "OPEN", change: [["TWENTY", 60], ["TEN", 20], ["FIVE", 15], ["ONE", 1], ["QUARTER", 0.5], ["DIME", 0.2], ["PENNY", 0.04]]}。

checkCashRegister(19.5, 20, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) 应返回 {status: "INSUFFICIENT_FUNDS", change: []}。

checkCashRegister(19.5, 20, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 1], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) 应返回 {status: "INSUFFICIENT_FUNDS", change: []}。

checkCashRegister(19.5, 20, [["PENNY", 0.5], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]) 应返回 {status: "CLOSED", change: [["PENNY", 0.5], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]}。

代码实现如下:

function checkCashRegister(price, cash, cid) {  let change = [];  let unit = {    "ONE HUNDRED": 100,    TWENTY: 20,    TEN: 10,    FIVE: 5,    ONE: 1,    QUARTER: 0.25,    DIME: 0.1,    NICKEL: 0.05,    PENNY: 0.01,  }  let cidUnitCount = getUnitCount(cid, unit);  let remain = cash - price, isSuit = true;  for (let key in unit) {    if (unit[key] <= remain) {      const unitPrice = unit[key];      const unitTotalCount = cidUnitCount[key];      let curTotalPrice = 0, curCount = 0;      while (curTotalPrice < remain && curCount < unitTotalCount) {        curCount++;        curTotalPrice = curCount * unitPrice;      }      if (curTotalPrice > remain) {        curCount--;        curTotalPrice = curCount * unitPrice;      }      if (curCount !== 0) {        change.push([key,curTotalPrice ]);        remain = (remain - curTotalPrice).toFixed(2);      }      if (curCount !== unitTotalCount) {        isSuit = false;      }    }  }  let result;  if (remain == 0) {    if (isSuit) {      result = { status: "CLOSED", change: cid };    } else {      result = { status: "OPEN", change: change };    }  } else {    result = { status: "INSUFFICIENT_FUNDS", change: [] };  }  return result;}function getUnitCount(arr, unit) {  let result = {};  arr.forEach(item => {    const [key, value] = item;    result[key] = Math.round(value / unit[key]);  })  return result;}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]]);checkCashRegister(3.26, 100, [["PENNY", 1.01], ["NICKEL", 2.05], ["DIME", 3.1], ["QUARTER", 4.25], ["ONE", 90], ["FIVE", 55], ["TEN", 20], ["TWENTY", 60], ["ONE HUNDRED", 100]])checkCashRegister(19.5, 20, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])checkCashRegister(19.5, 20, [["PENNY", 0.01], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 1], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])checkCashRegister(19.5, 20, [["PENNY", 0.5], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]])