Queen2
@Queen2

Какие способы есть для расширяемого конвертера валют?

Код правильно работает с данными которые уже у него есть в Json, НО главная проблема в том что если нужно добавить новую валюту то приходиться добавлять коэффициенты для всех существующих. Как можно это автоматизировать?
{
    "metr":{
        "name": "metr",
        "metr":1,
        "kilometers": 0.01,
        "inch": 0.039,
        "foot": 0.32,
        "sm": 100
    },
    "sm":{
        "name": "sm",
        "sm": 1,
        "metr":0.01,
        "kilometers": 1e-5,
        "inch": 0.39,
        "foot": 0.032
    },
    "kilometers":{
        "name": "kilometers",
        "metr":1000,
        "sm": 10000,
        "inch": 39370,
        "foot": 3280
    },
    "inch":{
        "name": "inch",
        "metr":0.0254,
        "sm": 2.54,
        "kilometers": 2.54e-5,
        "foot": 0.083
    },
    "foot":{
        "name": "foot",
        "metr":0.3048,
        "sm": 30.48,
        "kilometers": 0.0003048,
        "inch": 12
    }
}

let input = document.querySelector('.input');
let inputRes = document.querySelector('.input-result');
let select = document.querySelector('.select-distance');
let selectRes = document.querySelector('.select-distance-result');
let text = document.querySelector('.text');

async function getResponce(){
    let response = await fetch('./app.json');
    let measurement = await response.json();
    let key;
    let result;
    for(key in measurement){
        select.innerHTML +=`<option>${measurement[key].name}</option>`
        selectRes.innerHTML +=`<option>${measurement[key].name}</option>`
    };
    input.addEventListener('input', () =>{
        checkChange();
    });
    select.addEventListener('change', ()=>{
        checkChange();
    });
    inputRes.addEventListener('input', () =>{
        checkChange();
    });
    selectRes.addEventListener('change', ()=>{
        checkChange();
    });
    function checkChange(){
        for(key in measurement){
            if(select.value == measurement[key].name){
                let selectMeasurement = select.value;
                let selectSecondMeasurement = selectRes.value;
                result = multiply(input.value, measurement[selectMeasurement][selectSecondMeasurement]);
                inputRes.value = result;
            };
        };
    };
    function multiply(inputValue, measurementNum){
        return (inputValue*measurementNum).toFixed(2);
    };
};
  • Вопрос задан
  • 78 просмотров
Решения вопроса 1
trapwalker
@trapwalker
Программист, энтузиаст
Вы можете добавить булев флаг "базовая единица", которая будет обозначать самую главную единицу измерения в своей группе. Кроме этого нужно добавить поля для указания ссылки на референсную единицу и коэффициент приведения к ней.
Тогда
1) у каждой единицы измерения будет всегда фиксированный набор атрибутов, и не надо редактировать все старые записи.
2) в рамках своей группы всегда можно привести значение к базовой единице, а потом к искомой - всего два преобразования, а если одна из единиц конвертации базовая, то одно.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы