转换自/到单元,避免使用大的if / switch语句

时间:2015-07-04 07:57:15

标签: javascript angularjs

我有一个if / else代码块,它返回从/到某个度量单位转换所需的数字,例如,如果我想从100转换为cm,它将返回mm //TODO: refactor if(scope.convertFrom == "mm" && scope.convertTo == "in") { _mod = 25.4; } if(scope.convertFrom == "mm" && scope.convertTo == "ft") { _mod = 304.8; } //...

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

现在,虽然我现在这样做的方式会起作用,如果我必须编写公制单位的所有可能组合,我最终会得到一个非常大且丑陋的if / else语句块。

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

编辑:在这里提取重要的一行:

PackageManager pm = getPackageManager();

2 个答案:

答案 0 :(得分:2)

创建一个存储" weight"的对象。每个单元(请注意,我使用Meter作为我的定位点,所以如果你想添加Foot或Inch,请记住这一点):

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

答案 1 :(得分:0)

如果library不是'一个选项。

取一些价值,例如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'))