Вычислить математические операторы из строки для использования со случайным числом

У меня есть математическая викторина, где числа рандомизированы, как и операторы, но чтобы сделать операторы случайными, мне пришлось поместить их в строку и использовать Math.random, который все работает, однако при попытке вычислить вопросы я не уверен, как оценить математические операторы.

var operationArray = ['x','&#247','+','-'];
var randomOperation1 = Math.floor(Math.random()*operationArray.length);
var randomOperation2 = Math.floor(Math.random()*operationArray.length);


  var randomNumber1 = Math.floor(Math.random() * 6) + 5;
  var randomNumber2 = Math.floor(Math.random() * 8) + 10;
  var randomNumber3 = Math.floor(Math.random() * 40 + 1);
  _questionText = document.getElementById("question").innerHTML = randomNumber1 + " " + operationArray[randomOperation1] + " " + randomNumber2 + " " + operationArray[randomOperation2] + " " + randomNumber3;

_decimalAnswer = randomNumber1 + randomNumber2 + randomNumber3;
  _answer = Math.round(_decimalAnswer);

После исследования я наткнулся на eval (), но не смог понять, как это будет работать, когда числа имеют случайные значения, а операторы являются строками.

Поведение ключевого слова "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) для оценки ваших знаний,...
0
0
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Хотя я бы вообще не рекомендовал использовать eval (зло). В этом случае это может быть необходимо.

var operationArray = ['x','&#247','+','-'];
var randomOperation1 = Math.floor(Math.random()*operationArray.length);
var randomOperation2 = Math.floor(Math.random()*operationArray.length);

var randomNumber1 = Math.floor(Math.random() * 6) + 5;
var randomNumber2 = Math.floor(Math.random() * 8) + 10;
var randomNumber3 = Math.floor(Math.random() * 40 + 1);
_questionText = document.getElementById("question").innerHTML = randomNumber1 + " " + operationArray[randomOperation1] + " " + randomNumber2 + " " + operationArray[randomOperation2] + " " + randomNumber3;

Замените операторы фактическими операторами, используемыми в коде.

_questionText = _questionText.replace(/&#247/g, '/').replace(/x/g, '*');

Оцените строку.

_decimalAnswer = eval(_questionText);
_answer = Math.round(_decimalAnswer);

Хорошая идея, и я не понимаю, почему это не сработает, но это не так. Я опубликую обновление, как только выясню почему. Спасибо.

LiamB645 31.10.2018 13:43

Что не работает? Я протестировал код в консоли Chrome, и у меня он сработал.

risutoru 31.10.2018 14:36

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

LiamB645 31.10.2018 15:47

Если я правильно вас понял, обычно вы хотите добиться этого:

var data = [1, "+", 2];
var result = yourFunction(data);
console.info(result);//3

Для этого вам потребуется написать парсер, который будет работать с вашим массивом и выполнять действия. Что-то вроде этого:

var result = 0;
for(var i = 0; i < data.length; i++) {
  switch(data[i]){
    case '+':
      result += data[i + 1];
      i++;
      break;
    default:
      result = data[i];
  }
}

Если вам нужно более сложное решение, см. этот дерьмовый код

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