从/到单位转换避免大型 if/switch 语句

问题描述 投票:0回答:2

我有一个 if/else 代码块,它返回从/到某个公制单位转换所需的数字,例如,如果我想从

100
转换为
cm
,它将返回
mm

这里是实际代码:http://plnkr.co/edit/WKutYRbB8d2BFiXvfsBE?p=preview(第24-31行)。

现在,虽然我目前的做法可行,但如果我必须编写所有可能的公制单位组合,我最终会得到一个非常大且丑陋的 if/else 语句块。

我的问题是如何避免这种情况并使代码更小/更干净?

编辑:在此处提取重要行:

//TODO: refactor
if(scope.convertFrom == "mm" && scope.convertTo == "in") {
    _mod = 25.4;
}
if(scope.convertFrom == "mm" && scope.convertTo == "ft") {
    _mod = 304.8;
}
//...
javascript angularjs
2个回答
3
投票

创建一个对象来存储每个单位相对于参考单位的“重量”。 (请注意,这里我使用米作为参考点,因此如果您想添加英尺或英寸,请记住这一点):

var units = {
  mm: 0.001,
  cm: 0.01,
  dm: 0.1,
  m: 1,
  km: 1000
}

然后写一个转换函数:

function convert(value, fromUnit, toUnit) {
  return value * (units[fromUnit] / units[toUnit])
}

像这样使用它:

convert(42, 'mm', 'cm')
// --> 4.2

0
投票

如果图书馆不是一个选项。

创造一些价值,例如mm 默认值,然后为每一项存储与给定基本单位的比率。然后,您可以将这些值保留在标记中或代码本身中。

<option value="mm" data-ratio="1">Millimeters</option>
<option value="in" data-ratio="0.0393701">Inches</option>

然后在代码中

var converted = value * (scope.convertFrom.getAttribute('data-ratio') / scope.convertTo.getAttribute('data-ratio'))
© www.soinside.com 2019 - 2024. All rights reserved.