我有一个 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;
}
//...
创建一个对象来存储每个单位相对于参考单位的“重量”。 (请注意,这里我使用米作为参考点,因此如果您想添加英尺或英寸,请记住这一点):
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
如果图书馆不是一个选项。
创造一些价值,例如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'))