Использование Formula.js чтобы получить результат из формулы в виде строки

#javascript #formula #formula.js

Вопрос:

https://formulajs.info/

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 в конце.