我有一个简单的功能,需要进行更改。自动售货机之类的东西。它包含2个参数:商品价格以及收到的一系列钞票和硬币。输出必须是仅[quarter, dime, nickel, penny]
格式的数字数组。例如,项目成本为3.29
,收到的金额为[1,1,2]
。在这种情况下,输出必须为[2,2,0,1]
,因为0.71
的变化可以分为2个季度,2个角钱,0个镍币和1个便士。如果收到的金额少于价格,则必须返回全部金额,但只能以上述格式返回。例如,如果价格为5
,但支付的金额为[2,2]
,则输出必须为[16,0,0,0]
。我创建了此函数:
`function change(price,paid) {
const totalPaidVal = paid.reduce((a,b)=>a+b,0)
if (totalPaidVal === price) {
return(Array(4).fill(0))
} else if (price > totalPaidVal) {
const qNum = Math.floor(totalPaidVal/0.25);
const dNum = Math.floor((totalPaidVal-(qNum*0.25))/0.1);
const nNum = Math.floor((totalPaidVal-(qNum*0.25)-(dNum*0.1))/0.05);
const pNum = Math.round((totalPaidVal-(qNum*0.25)-(dNum*0.1)-(nNum*0.05))/0.01);
const arr = [qNum,dNum,nNum,pNum];
return arr;
} else if(price<totalPaidVal) {
const change = totalPaidVal-price;
const qNum = Math.floor(change/0.25);
const dNum = Math.floor((change-(qNum*0.25))/0.1);
const nNum = Math.floor((change-(qNum*0.25)-(dNum*0.1))/0.05);
const pNum = Math.round((change-(qNum*0.25)-(dNum*0.1)-(nNum*0.05))/0.01);
const arr = [qNum,dNum,nNum,pNum];
return arr;
}
}`
它工作正常,但我知道好像我再重复一遍,什么不好。我一直在尝试创建其他变量来清理它,但它看起来仍然很奇怪。必须有一种更有效的方法来做到这一点,而不必一直重复相同的代码。因此,这里有一个问题:什么是清理它并使它看起来比现在更简单的最佳方法?
答案 0 :(得分:2)
您可以使用函数从代码中删除重复项。
function getNums(value){
const qNum = Math.floor(value/0.25);
const dNum = Math.floor((value-(qNum*0.25))/0.1);
const nNum = Math.floor((value-(qNum*0.25)-(dNum*0.1))/0.05);
const pNum = Math.round((value-(qNum*0.25)-(dNum*0.1)-(nNum*0.05))/0.01);
return [qNum,dNum,nNum,pNum];
}
根据条件调用此功能
if (price > totalPaidVal) {
return getNums(totalPaidVal)
} else if(price < totalPaidVal){
return getNums(totalPaidVal - price)
}