2016-02-04 5 views
-2

Я делаю калькулятор. И задача состоит в том, чтобы не использовать eval(). Я сделал массив из всех входов который выглядит следующим образом:добавление/деление/умножение чисел и операторов из массива в javascript без eval()

numbers = [1,1,'+',2,'*',3,'-','(',4,'*',5,'+',2,'/',5,')']; 

Тогда я преобразовать этот массив в строку, удалить, и я получаю строку, как это:

numberString = "11+2*3-(4*5+2/5)"; 

Так мой вопрос есть, каков способ правильно рассчитать результат этого уравнения без использования eval()?

+0

Вы не можете поместить арифметические операторы в такой массив, разве вы не получаете синтаксическую ошибку? Вам нужно сделать строку с кавычками. ' '+' '. – Barmar

+0

Это так, но это как часть текста, чтобы сформулировать мой вопрос, а не код для запуска. Я обновлю вопрос, чтобы он не вводил в заблуждение :) –

+0

См. Http://stackoverflow.com/questions/21202716/using-select-value-as-operator/21202809#21202809 о том, как сопоставить операторные строки с функциями, которые выполнить эту операцию. – Barmar

ответ

0

Используйте объект для сопоставления операторных строк с функциями, реализующими оператор.

var operators = { 
    '+': function(x, y) { return x + y; }, 
    '-': function(x, y) { return x - y; }, 
    '*': function(x, y) { return x * y; }, 
    '/': function(x, y) { return x/y; } 
}; 

( функция должна толкать состояние в стек, и ) должен вытолкнуть стек.

+0

Спасибо. Я попытаюсь глубже проникнуть в ссылку, которую вы предложили. http://stackoverflow.com/questions/21202716/using-select-value-as-operator/21202809#21202809 –

0

Используйте это,

function notEval(fn) { 
 
    return new Function('return ' + fn)(); 
 
} 
 
numbers = [1, 1, '+', 2, '*', 3, '-', '(', 4, '*' , 5, '+', 2,' /', 5, ')']; 
 
console.log(numbers.join('') + ' = ' + notEval(numbers.join('')));

Courtesy.

+0

Такой умный способ! – Quarter2Twelve

+0

Космическая магия :)) Мне нужно лучше взглянуть на это, чтобы полностью понять, как это работает. –

+1

Построение функции эквивалентно использованию 'eval', это просто другой синтаксис. – Barmar