Как можно оптимизировать конвертер?

Есть данные в JSON файле:

const unitsObj = [
  {
    distance: {
      unit: "m",
      value: 0.5,
    },
    convertTo: "ft",
  },
  {
    distance: {
      unit: "m",
      value: 0.5,
    },
    convertTo: "cm",
  },
]

И есть конвертер, который я написал:

const unitsObj = [
  {
    distance: {
      unit: "m",
      value: 0.5,
    },
    convertTo: "ft",
  },
  {
    distance: {
      unit: "m",
      value: 0.5,
    },
    convertTo: "cm",
  },
];

const metersConversion = () => {
  unitsObj.forEach((item) => {
    let distanceUnit = item.distance.unit;
    let unitValue = item.distance.value;
    let convertTo = item.convertTo;
    if (distanceUnit == "m" && convertTo == "ft") {
      let conversionResult = {
        unit: convertTo,
        value: (unitValue * 3.28).toFixed(2),
      };
      console.log(conversionResult);
    }
    if (distanceUnit == "m" && convertTo == "cm") {
      let conversionResult = {
        unit: convertTo,
        value: (unitValue * 100).toFixed(2),
      };
      console.log(conversionResult);
    }
  });
};
metersConversion();

Но если добавлять новые единицы, то код становиться большим. Есть ли варианты уменьшить код и как-то оптимизировать конвертер? Буду благодарен за помощь)


Ответы (1 шт):

Автор решения: EzioMercer

Если из JSON-a не приходит множитель и всегда надо переводить метры во что-нибудь, то можете попробовать так:

const unitsObj = [
  {
    distance: {
      unit: "m",
      value: 0.5,
    },
    convertTo: "ft",
  },
  {
    distance: {
      unit: "m",
      value: 0.5,
    },
    convertTo: "cm",
  },
];

const getMultiplier = (convertUnit) => {
    switch (convertUnit) {
        case 'cm':
            return 100;
        case 'ft':
            return 3.28;
        default:
            throw new Error('Can not convert to this unit');
    }
}

const metersConversion = () => {
  unitsObj.forEach((item) => {
    const unitValue = item.distance.value;
    const convertTo = item.convertTo;
    const multiplier = getMultiplier(convertTo);
      
    console.log({
        unit: convertTo,
        value: (unitValue * multiplier).toFixed(2)
    });
  });
};

metersConversion();

→ Ссылка