Javascript 如何重构我的代码以应对这个编码挑战?

Javascript 如何重构我的代码以应对这个编码挑战?,javascript,arrays,database,object,Javascript,Arrays,Database,Object,我终于完成了freecodecamp.org上的收银机挑战,我想知道如何进一步清理我的代码。我需要帮助重构我的代码。此处链接到挑战: 我觉得我的代码已经足够干净了,但我对编码还是新手 function checkCashRegister(price, cash, cid) { let result = {status: 'OPEN', change: []} const denomination = new Map([ ['ONE HUNDRED', 100], ['TWE

我终于完成了freecodecamp.org上的收银机挑战,我想知道如何进一步清理我的代码。我需要帮助重构我的代码。此处链接到挑战:

我觉得我的代码已经足够干净了,但我对编码还是新手

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]])
功能支票收银机(价格、现金、cid){
让结果={状态:“打开”,更改:[]}
常量命名=新地图([
[100',100],[20',20],
[10,10],[5,5],
[1',1],[1',0.25],
[一角硬币,0.10],“镍”,0.05],
[PENNY',0.01]];
让moneyDue=现金-价格
让total=cid.reduce((acc,next)=>{
返回acc+数学循环(下一个[1]*100)/100
}, 0)
如果(总额<应付款项){
result.status=“资金不足”
返回结果
}
如果(总计==到期应付款){
result.status=“已关闭”
result.change=cid
返回结果
}
const newCID=新映射(cid.reverse())
让计数=-1
设和=0
对于(面额的[名称,价值]){
计数++
while(值0){
cid[计数][1]-=值
总和+=值
应付款项-=价值
moneyDue=数学四舍五入(moneyDue*100)/100
}
如果(总和>0){
result.change.push([cid[count][0],sum]);}
总和=0;
}
如果(到期应付款!==0){
result.status=“资金不足”
result.change=[]
返回结果
}
返回结果;
}
支票收银机(19.5,20,[“便士”,1.01),“镍币”,2.05),“一角”,3.1),“四分之一”,4.25),“一”,90),“五”,55),“十”,20),“二十”,60),“一百”,100])

我使用了一些对象分解,清理了reduce函数,更新了格式,删除了一些return函数。希望这有帮助

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]
]);
const checkcash register=(价格、现金、cid)=>{
让结果={状态:“打开”,更改:[]};
常量命名=新地图([
[“一百”,一百],
[“二十”,20],
[“十”,10],
[“五”,5],
[“一”,1],
[“季度”,0.25],
[“一角”,0.1],
[“镍”,0.05],
[“便士”,0.01]
]);
让moneyDue=现金-价格;
const total=cid.reduce(
(acc,next)=>acc+数学循环(next[1]*100)/100,
0
);
如果(总额<应付款项){
返回{change:result.change,状态:“资金不足”};
}
如果(总计===应付款项){
返回{状态:“关闭”,更改:cid};
}
const newCID=新映射(cid.reverse());
让计数=-1;
设和=0;
对于(面额的[名称,价值]){
计数++;
while(值0){
cid[计数][1]-=值;
总和+=数值;
应付款项-=价值;
moneyDue=数学四舍五入(moneyDue*100)/100;
}
如果(总和>0){
结果.change.push([cid[count][0],sum]);
}
总和=0;
}
如果(到期应付款!==0){
结果={状态:“资金不足”,更改:[]};
}
返回结果;
};
支票收银机(19.5、20、[
[“便士”,1.01],
[“镍”,2.05],
[“一角”,3.1],
[“季度”,4.25],
[“一”,90],
[“五”,55],
[“十”,20],
[“二十”,60],
[“一百”,一百]
]);
/**这是我的垃圾代码,我想没有人的垃圾代码会比我的更复杂。希望
还有人帮我打扫。多谢各位**/
功能支票收银机(价格、现金、cid){
cid=cid.reverse();
cid[0][2]=100;
cid[1][2]=20;
cid[2][2]=10;
cid[3][2]=5;
cid[4][2]=1;
cid[5][2]=0.25;
cid[6][2]=0.1;
cid[7][2]=0.05;
cid[8][2]=0.01;
让cha={};
让total=cid.reduce((a,b)=>a+b[1],0);
收费=现金-价格;
设rc=电荷;
设arr=[];
如果(费用>总额){
cha.status=“资金不足”;
cha.change=[];
}
否则{
对于(cid的let项){
如果(费用=0){
如果(rc==总计){
arr.push(项目);
}
打破
}
否则{
如果(费用<项目[2]){
如果(rc==总计){
arr.push(项目);
}
继续;
}
否则{
设i=0;
设v=第[1]项;
而(费用>=项目[2]&&v>0){
v=v-第[2]项;
费用=(费用-项目[2])固定(2);
i++;
控制台日志(收费);
}
第[1]项=i*第[2]项;
}
}    
arr.push(项目);
}
用于(arr的let项目){
项目1.pop()
}
如果(rc==总计){
cha.status=“已关闭”;
cha.change=arr.reverse();
}
否则{
cha.status=“打开”;
cha.change=arr;
}
如果(费用>0){
cha.status=“资金不足”;
cha.change=[];
}
}
返回cha;
}
支票收银机(19.5、20、[“便士”、“0.5”、“镍币”、“0”、“一角”、“0”、“四分之一”、“0”、“一”、“0”、“五”、“0”、“十”、“0”、“二十”、“0”、“一百”、“0]”);

可能是一个更好的地方。thx我会尝试一下,我已经更新了答案。出于某种原因,编译器没有在站点中使用spread运算符。如果使用“扩展”操作符在浏览器中运行代码,则代码将正常工作。我还从代码中删除了elseif条件。让它更干净。你可能还想调查一下spread操作符。它使您的代码更加清晰。
/** Here is my garbage code and I think no one's would be complicated than mine. Hope 
some one to help me clean it too. Thank you very much.**/


 function checkCashRegister(price, cash, cid) {
    
      cid = cid.reverse();
    
      cid[0][2]=100;
      cid[1][2]=20;
      cid[2][2]=10;
      cid[3][2]=5;
      cid[4][2]=1;
      cid[5][2]=0.25;
      cid[6][2]=0.1;
      cid[7][2]=0.05;
      cid[8][2]=0.01;
    
      let cha={};
      let total = cid.reduce((a,b)=>a+b[1],0);
      let charge = cash - price;
      let rc = charge;
      let arr = [];
    
      if (charge>total){
        cha.status="INSUFFICIENT_FUNDS";
        cha.change = [];
      }
    
      else{
      
      for (let item of cid){
        if (charge == 0){
          if (rc==total){
                arr.push(item);
            }
            break;
        }
        else{
          if (charge < item[2]){
            if (rc==total){
                arr.push(item);
          }
          continue;
        }
          else {
            let i=0;
            let v = item[1];
            while(charge>=item[2]&&v>0){
              
              v = v - item[2];
              charge = (charge - item[2]).toFixed(2);
              i++;  
              console.log(charge);  
                 
          }
          
          item[1]=i*item[2];
         }
       }    
        arr.push(item);
        
    }
    
       
       for (let item of arr){
         item.pop()
       }
       
        if (rc==total){
        cha.status="CLOSED";
        cha.change = arr.reverse();
      }
        else {
        cha.status="OPEN";
        cha.change = arr;
      }
      if (charge>0){
        cha.status="INSUFFICIENT_FUNDS";
        cha.change = [];
      }
        
      }
      
      return cha;
    
    }
    
    checkCashRegister(19.5, 20, [["PENNY", 0.5], ["NICKEL", 0], ["DIME", 0], ["QUARTER", 0], ["ONE", 0], ["FIVE", 0], ["TEN", 0], ["TWENTY", 0], ["ONE HUNDRED", 0]]);