Как использовать/обрабатывать математическую формулу, сохраненную в формате JSON, в JavaScript

Я создаю калькулятор преобразования. Я хотел бы сохранить ссылки и формулы для калькулятора в формате 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

Это возможно? Есть ли способ лучше?

На мой взгляд здесь недостаточно информации. Какую «математику» вам нужно обработать? Обработка нескольких операторов в простых ситуациях — это совсем другая проблема, чем написание полнофункционального математического анализатора. «/1728» прост, но /(2+3^(40*5-3)) начинает усложняться. А как насчет (2)(3) против *2*3 и т. д. Я думаю, это требует некоторого уточнения. Также укажите, что вас беспокоит. Что значит «лучше»? Ваш подход не работает должным образом?

CollinD 02.08.2024 18:52

Все это будут формулы преобразования... поэтому это всегда будет X (ввод формы) (деленный на число или умноженный на число). Ничего более сложного. В этом примере я передаю «/1758» в качестве «формулы». Я также мог бы передать число и тип (умножение или деление) как отдельные поля json... Но тогда я предполагаю, что мне придется сделать if/else на том. Подумал, что проще этого избежать. (Итак, именно это я и сделал — будет ли это лучшим способом? Передать математический тип как значение json.) Меня беспокоит то, что мое решение вообще не работает. Это не расчет.

Big Fat Designs 02.08.2024 20:39

Я бы предложил включить часть этой информации в ваш вопрос. Сделайте более очевидным то, что именно вы пытаетесь построить. Сделайте более очевидным, что происходит не так (кроме того, «он не вычисляет» гораздо менее полезно, чем «он выдает эту ошибку» или «он всегда возвращает 0», обратите внимание на то, что происходит, а не на то, что НЕТ). происходит). Также я бы посоветовал попробовать использовать функцию фрагмента JS в качестве минимально воспроизводимого примера

CollinD 02.08.2024 21:03

Как будет выглядеть этот JSON, если в нем есть формула преобразования градусов Фаренгейта в градусы Цельсия?

trincot 02.08.2024 22:37

Есть много лучших способов, но невозможно сказать, какой из них «лучший», поскольку у этого вопроса нет контекста. Показанный способ с использованием eval работает. Что еще нужно, кроме работы?

Travis J 02.08.2024 22:46

@trincot — Не знаю, как это будет работать в этом формате. (Я еще не дошел до этого — это будет дальше.) В моей текущей настройке каждый тип конверсии получает свою собственную страницу и json. Так что я бы/мог сделать этот обычай.

Big Fat Designs 02.08.2024 22:52

Можете ли вы объяснить, почему это должен быть JSON (т. е. текстовый формат)? Если это просто объект JavaScript, тогда вы можете просто присвоить объекту преобразования свойство, которое является функцией преобразования.

trincot 02.08.2024 22:55

Это не обязательно должен быть 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}`);

Big Fat Designs 03.08.2024 00:06
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
9
75
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

похоже, что вы пытаетесь достичь, хотя использование 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. Но я использую вот так:

convert Screen]

Пример 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;
        }
    }
}

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

Пожалуйста, делайте отступы в коде правильно.

Barmar 03.08.2024 00:05

Другие вопросы по теме