Как перевести имперские в метрические единицы? - PullRequest
0 голосов
/ 01 октября 2019

Это более общий вопрос как кода, так и математики. Я не очень хорош в математике, и я все еще учусь, как применять математику в программировании.

Скажем, у меня есть объект данных, у которого есть количество, измерение и тип,такие как feet или lb.

const data = {
  0: {
    'type': 'imperial',
    'unit': 'ft',
    'amount': 3 
  },
  1: {
    'type': 'imperial',
    'unit': 'lb',
    'amount': 5
  },
  2: {
    'type': 'imperial',
    'unit': 'mph',
    'amount': 7 
  }
}

И мне нужно просмотреть эти данные и преобразовать каждый в соответствии с типом (при условии, что тип называется)

Object.keys(data).map(key => {
    convert(data[key]['amount'], data[key]['type'], data[key]['unit'])
})

И функция преобразует это:

const convert = (amount, type, unit) => {
   const calc = // ???
   return calc;
}

Мой вопрос, как я могу конвертировать в зависимости от типа измерения? Я знаю, что 1 фут равен 0,3048 метра, и если бы мне нужно было преобразовать 5 футов в метры, я бы сделал 5*0.3048.

Однако, как я могу применить это в коде со списком имперских иметрические единицы и как бы я добавил это к функции преобразования?

1 Ответ

0 голосов
/ 01 октября 2019

Вы можете иметь converter Объект с функциями для преобразования и метками для отображения, вот пример (настройте значения и единицы в соответствии с вашими потребностями):

const data = {
  0: {
    type: "imperial",
    unit: "ft",
    amount: 3
  },
  1: {
    type: "imperial",
    unit: "lb",
    amount: 5
  },
  2: {
    type: "imperial",
    unit: "mph",
    amount: 7
  }
};

const converter = {
  imperialToMetric: {
    ft: val => val * 0.3048,
    lb: val => val * 0.453592,
    mph: val => val * 1.60934,
    labels: {
      ft: "meters",
      lb: "Kg",
      mph: "kmh"
    }
  },
  metric: {
    // reverse the above
  }
};

const result = Object.values(data).map(({ amount, type, unit }) => ({
  amount: converter.imperialToMetric[unit](amount),
  unit: converter.imperialToMetric.labels[unit],
  type: "metric"
}));

console.log(result);
...