Javascript 如何重构我的代码以应对这个编码挑战?
我终于完成了freecodecamp.org上的收银机挑战,我想知道如何进一步清理我的代码。我需要帮助重构我的代码。此处链接到挑战: 我觉得我的代码已经足够干净了,但我对编码还是新手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
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]]);