首页 > 解决方案 > 我如何为这个编码挑战重构我的代码?

问题描述

我终于完成了在 freecodecamp.org 上找到的收银机挑战,我想知道如何进一步清理我的代码。我需要帮助重构我的代码。链接到这里挑战:https ://learn.freecodecamp.org/javascript-algorithms-and-data-structures/javascript-algorithms-and-data-structures-projects/cash-register

我觉得我的代码很干净,但我还是新手

function checkCashRegister(price, cash, cid) {
  let result = {status: 'OPEN', change: []}

  const denomination = new Map([
    ['ONE HUNDRED', 100],   ['TWENTY', 20], 
    ['TEN', 10],            ['FIVE', 5],            
    ['ONE', 1],             ['QUARTER', 0.25],      
    ['DIME', 0.10],         ['NICKEL', 0.05],       
    ['PENNY', 0.01]]);

  let moneyDue = cash - price
  let total = cid.reduce((acc, next) => { 
     return acc + Math.round(next[1] * 100) / 100
  }, 0)

  if(total < moneyDue){  
    result.status = "INSUFFICIENT_FUNDS"
    return result
  }
  else if(total === moneyDue){ 
    result.status = "CLOSED"
    result.change = cid
    return result
  }

  const newCID = new Map(cid.reverse())
  let count = -1
  let sum = 0

  for (let [denom, value] of denomination){
    count++
    while (value <= moneyDue && cid[count][1] > 0 ) {
      cid[count][1] -= value
      sum += value
      moneyDue -= value
      moneyDue = Math.round(moneyDue * 100) / 100
    }

    if (sum > 0){
    result.change.push([cid[count][0],sum]);}
    sum = 0;
  }

  if(moneyDue !== 0){
    result.status = "INSUFFICIENT_FUNDS"
    result.change = []
    return result
  }
  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]])

标签: javascriptarraysdatabaseobject

解决方案


我使用了一些对象解构,清理了 reduce 函数,更新了格式并删除了清理了一些返回函数。希望这可以帮助。

const checkCashRegister = (price, cash, cid) => {
  let result = { status: "OPEN", change: [] };

  const denomination = new Map([
    ["ONE HUNDRED", 100],
    ["TWENTY", 20],
    ["TEN", 10],
    ["FIVE", 5],
    ["ONE", 1],
    ["QUARTER", 0.25],
    ["DIME", 0.1],
    ["NICKEL", 0.05],
    ["PENNY", 0.01]
  ]);

  let moneyDue = cash - price;
  const total = cid.reduce(
    (acc, next) => acc + Math.round(next[1] * 100) / 100,
    0
  );

  if (total < moneyDue) {
    return { change: result.change, status: "INSUFFICIENT_FUNDS" };
  }
  if (total === moneyDue) {
    return { status: "CLOSED", change: cid };
  }

  const newCID = new Map(cid.reverse());
  let count = -1;
  let sum = 0;

  for (let [denom, value] of denomination) {
    count++;
    while (value <= moneyDue && cid[count][1] > 0) {
      cid[count][1] -= value;
      sum += value;
      moneyDue -= value;
      moneyDue = Math.round(moneyDue * 100) / 100;
    }

    if (sum > 0) {
      result.change.push([cid[count][0], sum]);
    }
    sum = 0;
  }

  if (moneyDue !== 0) {
    result = { status: "INSUFFICIENT_FUNDS", change: [] };
  }

  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]
]);

推荐阅读