JSFiddle - React, Tailwind, and code Playground
by lid0
HTML
<pre>
parse
">0 && <10 && != 5"
so we can evalutate like:
"v>0 && v<10 && v != 5"
returns
{
bools: ["&&", "&&"]
expressions: [
[">0", ">", "0"],
["<10", "<", "10"],
["!=0", "!=", "0"],
]
}
</pre>
JavaScript
// author lidlanca 2021 april 23
/**
parse
">0 && <10 && != 5"
so we can evalutate like:
"v>0 && v<10 && v != 5"
returns
{
bools: ["&&", "&&"]
expressions: [
[">0", ">", "0"],
["<10", "<", "10"],
["!=0", "!=", "0"],
]
}
**/
function parseExpressions(exprString) {
var x = exprString
x1 = x.replaceAll(" ", "")
x2 = x1.split(/&&|\|\|/)
x3 = [...x1.match(/&&|\|\|/g)]
x4 = x2.map(v => {
return v.match(/([\<\>\=\!]+)(.+)/)
})
console.log(x1, x2, [...x3], "x4", x4)
return {
bools : x3,
expressions: x4
}
}
var ops = {
">": (a, b) => a > b,
">=": (a, b) => a >= b,
"<": (a, b) => a < b,
"<=": (a, b) => a <= b,
"==": (a, b) => a == b,
"!=": (a, b) => a != b,
}
var boolsFuncs = {
"&&": (a, b) => a && b,
"||": (a, b) => a || b
}
function evaluate(val, p) {
console.log("SSS", p)
var i = 0
var _v = null
for (j = 0; j < p.expressions.length; j++) {
var expr_op = p.expressions[j][1]
var expr_val = p.expressions[j][2]
var op_func = ops[expr_op]
var _c = op_func(val, expr_val) // current value
if (j > 0) { // not first iteration
var cbool = p.bools.shift()
console.log(cbool)
if (!boolsFuncs[cbool](_c, _v)) {
return false
}
}
_v = _c // update _v to last
}
return true
}
var result = evaluate(5, parseExpressions(">0 && <10 && == 5") )
console.log(result)