#javascript #formula #formula.js
Вопрос:
https://github.com/formulajs/formulajs
Я пытаюсь использовать formula.js
, где пользователь передает формулу с помощью элемента ввода.
Пользователь передает строку из ввода как:-
'SUM(1,2)'
Тем не менее, formulajs принимает в приведенном ниже формате как:-
formulajs.SUM(1, 2)
Как обращаться с «СУММОЙ(1,2)» с помощью formula.js?
Ответ №1:
Что ж, их пример просто кусает пулю — и делает это с eval
помощью . Вот их код:
$('#formula-box').on('submit', function (event) {
event.preventDefault();
$('#out').val(eval($('#in').val()));
});
… со всеми оговорками такого подхода. Идея заключается в том, что глобальная область действия уже расширена за счет всех функций, поддерживаемых Formula.js, поэтому eval("ISOWEEKNUM('3/9/2012')")
вызовет функцию ISOWEEKNUM
, передающуюся 3/9/2012
в качестве аргумента.
Альтернативой является анализ выражения, отделение имени функции (идентификатор, за которым следует необязательный пробел, за которым следует (
символ) от параметров (которые могут быть допустимыми выражениями JS), а затем передача извлеченного имени данных и параметров в ваш код.
Если вы решите пойти этим путем, вы можете сделать это самостоятельно для простых случаев, но я настоятельно рекомендую повторно использовать один из пакетов (например, jsep) для оценки частей выражения.
Комментарии:
1. Поскольку у eval есть проблемы с безопасностью, поэтому использование формул не будет безопаснее?. Итак, если мы выберем jsep или esprima для преобразования в синтаксическое дерево, но затем как оценить допустимое выражение js в конце.
2. Formula.js имеет небольшую часть синтаксического анализатора, но он довольно ограничен в своих возможностях и используется только для обработки выражений, передаваемых в качестве строковых аргументов (
SUMIF
например, для функций).3. Поэтому, если мы выберем jsep или esprima для преобразования в синтаксическое дерево, но затем как получить результат из допустимой строки js в конце.