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)