微信小程序实现带参数的字符串表达式判断真值

先看效果图

在这里插入图片描述


在这之前有大佬实现了微信小程序中的eval,亲测过,可行,但体量有点大,决定自己写个简单的eval,不求实现复杂逻辑,够用就行。

一、背景

应公司需求,计算表达式的true,false值,如
"STATUS===10||STATUS===20"

计算之前需将其中的STATUS变量转变为实际的值如:
"10===10||10===20"

为了更好辨认变量,将变量用特殊字符串标记起来,如:[%=STATUS%]
将原表达式定为"[%=STATUS%]===10||[%=STATUS%]===20"

二、实现逻辑

将给定表达式"[%=STATUS%]===10||[%=STATUS%]===20"分解成数组,同时将标记的变量STATUS赋值并去掉标记字符串,得到的字符串如下:
(假设实际STATUS==='10'
['10', '===', '10', '||', '10', '===', '20']
根据数组中的||&&拆分成两个简单的数组['10', '===', '10']'10', '===', '20']
分别硬判断得到两个boolean值,再将两个boolean值做||&&操作,得到最终的boolean。
当然这里是两个小表达式组成的情况,如果是三个或以上的情况,就要用到循环算法来解决,这里我采用递归算法。

三、贴上代码

封装类utils.js

const sfEval = (model, str, property = null) => {
   
  let cs = str.replace(/\s*/g, '').replace(/\[%=/g, '').replace(/%\]/g, '').split(/(&&|\|\||>|<|===|!==|>=|<=|\(|\))/)
  for (const cIdx in cs) {
   
    if (property && model[cs[cIdx]] !== undefined) {
   
      // 处理0.aaa的问题
      // 处理以0开头的字符串
      // parseFloat
      // parseFloat('') NaN
      // parseFloat(null) NaN
      // parseFloat(true) NaN
      // parseFloat(false) NaN
      // Number('0.aaa') NAN
      // 不是''不是null不是true不是false
      // 是false // 后面即使是true也不走
      // 是 0.aaa true // 后面是false
      // 对象和数组都是parseFloat之后都是NaN
      if (model[cs[cIdx]]) {
   
        if (!isNaN(parseFloat(model[cs[cIdx]][property])) && !isNaN(Number(model[cs[cIdx]][property]))) {
   
          // 之后一个判断处理字符串'0000'的情况
          // 如何处理
          if ((model[cs[cIdx]][property] + '').charAt() === '0' && (model[cs
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值