Javascript 在这个js代码片段中使用break语句是一种好的做法吗?

Javascript 在这个js代码片段中使用break语句是一种好的做法吗?,javascript,performance,recursion,refactoring,Javascript,Performance,Recursion,Refactoring,此函数的目的是根据给定的航空公司费率表(参数1)和权重(参数2)计算价格(结果)。rates数组中的数组行表示:[体重突破,rate/kg,断点] 计算示例: 检查给定重量是否低于重量断裂(wb),应用最小速率,即wb*速率 如果没有,则检查重量是否低于断点(bp),计算重量*比率 如果权重高于bp,则应用下一个数组的wb乘以下一个数组的速率 注意:费率表的最后一行没有bp。这些表就是这样提供的 TLDR: 我的代码工作得很好(见下文),但我对这方面非常陌生,我想知道是否有更好的方法来编

此函数的目的是根据给定的航空公司费率表(参数1)和权重(参数2)计算价格(结果)。rates数组中的数组行表示:[体重突破,rate/kg,断点]

计算示例:

  • 检查给定重量是否低于重量断裂(
    wb
    ),应用最小速率,即
    wb*速率
  • 如果没有,则检查重量是否低于断点(
    bp
    ),计算
    重量*比率
  • 如果权重高于
    bp
    ,则应用下一个数组的
    wb
    乘以下一个数组的速率
注意:费率表的最后一行没有
bp
。这些表就是这样提供的

TLDR:

我的代码工作得很好(见下文),但我对这方面非常陌生,我想知道是否有更好的方法来编写这个小算法。我发现了递归,但我不知道如何编写递归函数。也许可以用更简洁的方式来写?我问这个问题是为了更好地编码。谢谢

rates = [
    [ 45, 3.8, 88 ],
    [ 100, 3.35, 296 ],
    [ 300, 3.3, 492 ],
    [ 500, 3.25]
];

function calcPrice(arr, weight) {
    let price = 0;
    for (let i = 0; i < arr.length; i++) {
        if (weight <= arr[i][0]) {
            price = arr[i][0] * arr[i][1]; break;
        } else if (weight <= arr[i][2] && arr[i][2] !== undefined) {
            price = weight * arr[i][1]; break;
        } else {
            price = weight * arr[i][1];
        }
    }
    return price;
}
console.log(calcPrice(rates, 89);
费率=[
[ 45, 3.8, 88 ],
[ 100, 3.35, 296 ],
[ 300, 3.3, 492 ],
[ 500, 3.25]
];
功能计算(arr、重量){
让价格=0;
for(设i=0;i如果(weight我认为有几种方法可以让这篇文章更简洁易读。其实只是一些小东西

第一个是名为的JavaScript技巧。这将允许您为数组中的值指定变量名,如下所示:

const[weightBreak,rate,breakpoint]=arr[i];
然后这个:
arr[i][0]*arr[i][1]
变成了
weightBreak*rate

另一个小问题是格式化(可能只需要在这个站点中键入)。即使它看起来很小,正确格式化代码对于可读性也有很大帮助

最后一件事:如果我们在
arr
中找不到任何项,
weight中标记了该项,那么似乎每次迭代都可以调用else块,我认为这是一个有用的调用。使用分解结构和默认参数的该函数的递归版本非常简单:

const calcPrice=([[wb,rate,bp=Infinity],…rates],weight=0)=>
体重forEach(v=>console.log(`${v}:${calcPrice(rates,v.toFixed(2)}'))
噢,哇,我知道了分解赋值的概念,但我没有意识到我可以将其应用于数组中的位置。但这很有意义。代码的可读性更高,就像这样。非常感谢。一次验证。您删除了else语句。我的理解是,在for循环中没有任何真正的ev吗计算,所以程序继续并点击最后一个返回,它将重量乘以最后一个项目?这是正确的。:)我这样做是因为这就是你问题中代码的基本情况。else块在每个循环中都会被计算,但只有最后一个值会被返回。没错!这样做很有意义。谢谢,今天早上我学到了一些东西。这是我第一次尝试键入有用的内容。制作Google Sheets中要使用的自定义函数::-。逐个检查数组是一件令人头疼的事情,主要是因为我的符号;-)。您的清理看起来更像是我为准备此操作而编写的伪代码:-)。谢谢,祝您有一天过得愉快!对于任何对有关解构的好文章感兴趣的人:谢谢Scott。这对我的学习非常有帮助学习经验。