Я создаю калькулятор преобразования. Я хотел бы сохранить ссылки и формулы для калькулятора в формате JSON.
Я не знаю, как «обработать переменную как математическую».
JSON
var JSON = {
"conversions": [{[
{
"FromType": "in3",
"ToType": "ft3",
"Math": "/1728",
"Description": "divide the volume value by 1728"
}...
С «Математикой» делается примерно так.
D1 = document.getElementById("data1").value;
var theAnswer = eval(D1 conversions[0].Math);
Пример:
D1 = 25
theAnswer = D1 /1728
theAnswer = 0.0144675
Это возможно? Есть ли способ лучше?
Все это будут формулы преобразования... поэтому это всегда будет X (ввод формы) (деленный на число или умноженный на число). Ничего более сложного. В этом примере я передаю «/1758» в качестве «формулы». Я также мог бы передать число и тип (умножение или деление) как отдельные поля json... Но тогда я предполагаю, что мне придется сделать if/else на том. Подумал, что проще этого избежать. (Итак, именно это я и сделал — будет ли это лучшим способом? Передать математический тип как значение json.) Меня беспокоит то, что мое решение вообще не работает. Это не расчет.
Я бы предложил включить часть этой информации в ваш вопрос. Сделайте более очевидным то, что именно вы пытаетесь построить. Сделайте более очевидным, что происходит не так (кроме того, «он не вычисляет» гораздо менее полезно, чем «он выдает эту ошибку» или «он всегда возвращает 0», обратите внимание на то, что происходит, а не на то, что НЕТ). происходит). Также я бы посоветовал попробовать использовать функцию фрагмента JS в качестве минимально воспроизводимого примера
Как будет выглядеть этот JSON, если в нем есть формула преобразования градусов Фаренгейта в градусы Цельсия?
Есть много лучших способов, но невозможно сказать, какой из них «лучший», поскольку у этого вопроса нет контекста. Показанный способ с использованием eval
работает. Что еще нужно, кроме работы?
@trincot — Не знаю, как это будет работать в этом формате. (Я еще не дошел до этого — это будет дальше.) В моей текущей настройке каждый тип конверсии получает свою собственную страницу и json. Так что я бы/мог сделать этот обычай.
Можете ли вы объяснить, почему это должен быть JSON (т. е. текстовый формат)? Если это просто объект JavaScript, тогда вы можете просто присвоить объекту преобразования свойство, которое является функцией преобразования.
Это не обязательно должен быть json — просто простой способ перебрать возможности. Я заставил eval() работать. (Он выдавал ошибку SyntaxError: Неожиданный токен ')' - которая меня зависала. Для преобразований TEMP я сделал это: Json: { "FromType": "F", "ToType": "C", "MathType": "std", "Factor": "- 32) * 5/9", "Description ": "(1°F - 32) * 5/9"} Обратите внимание на "-32)" в начале фактора: мне нужно было нормализовать формулу, чтобы она не нарушалась при других преобразованиях. Поэтому мне нужно добавить (
D1 = document.getElementById("data1").value; D1A = ` ( + ${D1} ; var theAnswer = eval(
${D1A} ${Factor}`);
похоже, что вы пытаетесь достичь, хотя использование eval() может работать.
Не рекомендую из соображений безопасности. Лучшим подходом было бы использовать более безопасный метод обработки.
Вот мое предложение:
используйте библиотеку типа
математика
Использовать в проекте библиотеку mathjs просто, вот путь
<script src = "https://cdn.jsdelivr.net/npm/[email protected]/dist/math.min.js"></script>
Затем мы можем использовать библиотеку для вычисления математических выражений.
const math = require('mathjs');
// assume the conversion is your JSON object
const conversion = conversions[0];
const D1 = document.getElementById("data1").value;
const theAnswer = math.evaluate('{$D1} ${conversion.Math}');
console.info(theAnswer);
Ранее я смотрел math.js. Но я использую вот так:
]
Пример Json:
const JSON = {
"conversions": [
{
"FromType": "atm",
"ToType": "psi",
"MathType": "multiply",
"Factor": 14.696,
"Description": "multiply the pressure value by 14.696"
},
{
"FromType": "atm",
"ToType": "mmHg",
"MathType": "multiply",
"Factor": 760,
"Description": "multiply the pressure value by 760"
},//other fields
]
}
Затем я зацикливаю Json, чтобы найти FromType
и ToType
на основе того, что пользователь выбрал в элементе select:
function calcFormula() {
convFrom = document.getElementById("ConvertA").value;
convTo = document.getElementById("ConvertB").value;
D1 = document.getElementById("data1").value;
let conversions = JSON.conversions;
for (var i in conversions) {
var FromType = conversions[i].FromType;
var ToType = conversions[i].ToType;
var MathType = conversions[i].MathType;
var Factor = conversions[i].Factor;
var Description = conversions[i].Description;
if (FromType === convFrom && ToType === convTo) {
if (MathType === "multiply") {
var theAnswer = (D1 * Factor);
} else {
var theAnswer = (D1 / Factor);
}
document.getElementById("convDescripton").innerHTML = Description;
}
}
}
Вероятно, это не так лаконично, как могло бы быть, но на данный момент он работает очень хорошо для преобразований массы, расстояния, давления и т. д.
Пожалуйста, делайте отступы в коде правильно.
На мой взгляд здесь недостаточно информации. Какую «математику» вам нужно обработать? Обработка нескольких операторов в простых ситуациях — это совсем другая проблема, чем написание полнофункционального математического анализатора. «/1728» прост, но
/(2+3^(40*5-3))
начинает усложняться. А как насчет(2)(3)
против*2*3
и т. д. Я думаю, это требует некоторого уточнения. Также укажите, что вас беспокоит. Что значит «лучше»? Ваш подход не работает должным образом?