У меня есть блок if if else, который возвращает нужный номер для преобразования из/в определенную метрическую единицу, например, он вернет 100
если я захочу преобразовать из cm
в mm
.
Вот фактический код: http://plnkr.co/edit/WKutYRbB8d2BFiXvfsBE?p=preview (строки 24-31).
Теперь, в то время как то, как я это делаю в настоящее время, будет работать, если бы мне пришлось написать все возможные комбинации метрических единиц, у меня получилось бы очень большой и уродливый блок операторов if/else.
Мой вопрос: как я могу избежать этого и сделать код более мелким/чистым?
EDIT: Извлеките важные строки здесь:
//TODO: refactor
if(scope.convertFrom == "mm" && scope.convertTo == "in") {
_mod = 25.4;
}
if(scope.convertFrom == "mm" && scope.convertTo == "ft") {
_mod = 304.8;
}
//...
Создайте объект, в котором хранится "вес" каждого блока (обратите внимание, что я использую метр в качестве точки наблюдения, поэтому, если вы хотите добавить 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
Если библиотека не является опцией.
Сделайте некоторое значение, например, значение по умолчанию, а затем для каждого элемента сохраняйте отношение к данному базовому блоку. Затем вы можете сохранить эти значения либо в разметке, либо в самом коде.
<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'))