Конвертировать из / в единицы, избегая больших операторов if / switch

0

У меня есть блок 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;
}
//...
Теги:

2 ответа

2
Лучший ответ

Создайте объект, в котором хранится "вес" каждого блока (обратите внимание, что я использую метр в качестве точки наблюдения, поэтому, если вы хотите добавить 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
  • 0
    Я думаю, что пойду по этому пути, поскольку использование библиотеки - это своего рода излишество для того, что я хочу сделать.
0

Если библиотека не является опцией.

Сделайте некоторое значение, например, значение по умолчанию, а затем для каждого элемента сохраняйте отношение к данному базовому блоку. Затем вы можете сохранить эти значения либо в разметке, либо в самом коде.

<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'))

Ещё вопросы

Сообщество Overcoder
Наверх
Меню