javascript - 我如何为这个编码挑战重构我的代码?
问题描述
我终于完成了在 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]])
解决方案
我使用了一些对象解构,清理了 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]
]);
推荐阅读
- html - 需要提示如何使最简单的 .CSHTML 自动完成
- python - python 编码项目中的谷歌可教机器模型加载问题
- javascript - 为什么 Angular 总是重定向到主页?
- azure-active-directory - 我可以将 bcrypted 密码导入 Azure AD B2C 吗?
- laravel - 如何更改 spatie 媒体库中的图像目录?
- react-native - 嵌套在 Stack Navigator 中的 Drawer 中的动态项目 react-navigation
- c# - 获取 ML NET 模型 zip 文件流时 Blazor 中的错误
- r - Read_csv 忽略分隔符
- .htaccess - .htaccess 重写命令的行为不符合预期
- python - 无法从 Windows 命令提示符运行 PIP 命令