Как мы можем оценить строку в формате «И (значение1, ИЛИ (значение2, значение3), значение4)», используя javascript? - PullRequest
0 голосов
/ 05 августа 2020

Предположим, у меня есть данные со значениями полей, поступающие из ответа на стороне сервера как

data: {
value1: '12',
value2: ''.
value3: 'some string',
value4: '34'
}

, и у меня есть другой ответ api со строкой формулы, которая должна быть оценена из внешнего интерфейса Javascript:

{
formula: "AND(value1, OR(value2,value3), value4)"
}

Как я могу оценить эту формулу из JS, при условии, что формула может быть динамической c например:

{
formula: "AND(value1, value2, value3, value4)"
}

1 Ответ

0 голосов
/ 05 августа 2020
  1. Давайте иметь функцию, которая может принимать несколько параметров и возвращать && операцию.
function and(...args) { return args.reduce((acc, x) => { return acc && x }, true) }

Установка значения по умолчанию как true.

мы сделаем то же самое для || операции
function or(...args) { return args.reduce((acc, x) => { return acc || x}, true) }

Установка значения по умолчанию как true.

заменим AND верхний регистр и OR верхний регистр на нижний.
"AND(value1, OR(value2,value3), value4)".replace("AND", "and")
"OR(value1, OR(value2,value3), value4)".replace("OR", "or")

Воспользуемся для этого функциями replace_and и replace_or

function replace_and(str) { return str.replace("AND", "and") }
function replace_or(str) { return str.replace("OR", "or")
Давайте заменим значения в формуле фактическими значениями из данных

Давайте добавим это как функцию и сделаем ее более умной, вычислив здесь как значение типа bool, только назначив его как значение. Это может помочь нам решить проблему смешения целых чисел, строк и разных типов.

function replace_values(data, formula) {
  return Object.entries(data).reduce((formula, [x, y]) => { 
                         bool = y ? true : false;
                         return formula.replace(x,bool); 
   }, formula)
}
Давайте оценим после прохождения всех 4 шагов.
eval("or(false, or(true))")
=> true

и мы можем оценить как цепочку таких функций, как эта

formula = "AND(value1, OR(value2,value3))"
data = {
value1: '12',
value2: '',
value3: 'some string',
value4: '34'
}

replace_values(data, replace_and(replace_or(formula)))
=> "and(true, or(false,true))"

eval(replace_values(data, replace_and(replace_or(formula))))
=> true

...