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

微信小程序的eval替代方法亲测能用!! 学校老师让我们用小程序写计算器,运行的时候发现eval函数用不了,找了很久,也试过装npm,搞了很久,但是一直报错,自己不喜欢写小程序所以没有耐心,这个是在网上找的。 以及eval函数还是要少用,不安全,不推荐 复制下面的代码就能直接用了 //测试 console.log(expressionCalc('5+4-2+7*3/2')); //17.5 var expressionCalc = ... 阅读详情
先看效果图

在这里插入图片描述


在这之前有大佬实现了微信小程序中的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[cIdx]][property] + '').length > 1) {
            cs[cIdx] = "'" + model[cs[cIdx]][property] + "'"
          } else {
            cs[cIdx] = parseFloat(model[cs[cIdx]][property])
          }
        } else {
          // 处理下拉框的清除问题 null以及其他null的问题
          if (model[cs[cIdx]][property] === null) {
            model[cs[cIdx]][property] = ''
          }
          cs[cIdx] = "'" + model[cs[cIdx]][property] + "'"
        }
      }
    } else if (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 (!isNaN(parseFloat(model[cs[cIdx]])) && !isNaN(Number(model[cs[cIdx]]))) {
        // 之后一个判断处理字符串'0000'的情况
        // 如何处理
        if ((model[cs[cIdx]] + '').charAt() === '0' && (model[cs[cIdx]] + '').length > 1) {
          cs[cIdx] = "'" + model[cs[cIdx]] + "'"
        } else {
          cs[cIdx] = parseFloat(model[cs[cIdx]])
        }
      } else {
        // 处理下拉框的清除问题 null以及其他null的问题
        if (model[cs[cIdx]] === null) {
          model[cs[cIdx]] = ''
        }
        cs[cIdx] = "'" + model[cs[cIdx]] + "'"
      }
    } else if ((cs[cIdx].indexOf("'") < 0 || (!isNaN(parseFloat(cs[cIdx].replace(/'/g, ''))) && !isNaN(Number(cs[cIdx].replace(/'/g, ''))))) && !cs[cIdx].match(/^(&&|\|\||>|<|===|!==|>=|<=|\(|\))$/)) {
      // convert to string fix bug for model is null with FIELD = '0', FIELD is undefined
      if (!isNaN(parseFloat(cs[cIdx].replace(/'/g, ''))) && !isNaN(Number(cs[cIdx].replace(/'/g, '')))) {
        if ((cs[cIdx] + '').charAt() === '0' && (cs[cIdx] + '').length > 1) {
          cs[cIdx] = "'" + cs[cIdx] + "'"
        } else {
          cs[cIdx] = parseFloat(cs[cIdx].replace(/'/g, ''))
        }
      } else {
        cs[cIdx] = "'" + cs[cIdx] + "'"
      }
    }
  }

  let csTemp = JSON.parse(JSON.stringify(cs))

  return true && fn(csTemp)
}

const fn = (csTemp) => {
  let resultBool = false
  let arr1 = []
  let arr2 = []
  if (csTemp.length < 4) {
    resultBool = calcFuc(csTemp)
    return resultBool
  } else {
    for (let i in csTemp) {
      if (csTemp[i] == '&&' || csTemp[i] == '||') {
        arr1 = csTemp.slice(0, i)
        arr2 = csTemp.slice(Number(i) + 1, Number(i) + 4)
        if (csTemp[i] == '&&') {
          resultBool = calcFuc(arr1) && calcFuc(arr2)
        } else {
          resultBool = calcFuc(arr1) || calcFuc(arr2)
        }
        csTemp.splice(0, Number(i) + 4, resultBool)
        return fn(csTemp)
        break
      }
    }
  }
}

const calcFuc = (arr) => {
  for (let i = 0; i < arr.length; i++) {
    switch (arr[i]) {
      case '&&':
        return arr[i - 1] && arr[i + 1]
      case '||':
        return arr[i - 1] || arr[i + 1]
      case '>':
        return arr[i - 1] > arr[i + 1]
      case '<':
        return arr[i - 1] < arr[i + 1]
      case '===':
        return arr[i - 1] === arr[i + 1]
      case '!==':
        return arr[i - 1] !== arr[i + 1]
      case '>=':
        return arr[i - 1] >= arr[i + 1]
      case '<=':
        return arr[i - 1] <= arr[i + 1]
      case true:
        return true
      default:
        break
    }
  }
  return false
}

module.exports = {
  sfEval
}
四、调用方法

先import封装方法,然后调用

let model = {
      USER: 'a',
      STATUS: 0,
      ROLE: 2
    }
let str = "[%=STATUS%]==='0'&&[%=ROLE%]==='2'&&[%=USER%]==='a'"
console.log('sfEval', sfEval(model, str))
五、运行结果

在这里插入图片描述

六、注意事项

本篇文章实现逻辑中包含的eval可仅跑通类似以下形式的字符串:

"2===2&&3!==4"
"2===2&&3!==4&&'a'!=='b'"
"2===2&&3!==4&&'a'!=='b'||'a'!=='b'"
"2===2||3!==4&&'a'!=='b'||'a'!=='b'"

不支持括号,按照从左到右的顺序计算。

七、结束语

到此就结束了,希望能帮到各位,记得拿走时请扣6
有问题在评论区留言

小程序eval完美替代方案 前言:在微信小程序使用eval进行计算的时候报错TypeError: eval is not a function,因为官方为了安全考虑把eval功能去掉了,网上有很多方法试过了不行,因此用二叉树算法完成简单四则运算可以满足一下简单的计算。 1.原理:二叉树算法完成简单四则运算,完成简单+-*/ ()的运算 2.熟悉概念 中缀表示法(或中缀记法)是一个通用的算术或逻辑公式表示方法, 操作符是... 阅读详情

相关推荐

微信小程序开发之不能使用eval函数的问题

(此图片来源于网络,如有侵权,请联系删除! )一 eval函数问题  JavaScript中的eval函数是颇受开发者争议的问题之一,问题主要在于其可能导致的不安全性。有关此方面问题,在此不再赘述,读者可能很容易地浏览到许多介绍性文章。  但是,eval函数的优点也是很明显的。例如,使用JS编写一个计算器程序,在遇到"2+1-3*5"这样的字符串时,使用eval就可以很容易地计算出,类似如:   var s="2+1-3*5"; console.log(eval(s)); 二 微信小程序练手遇到问题 (1)微信小程序环境不支持eval函数 在学习微信小程序开发过程中,想使用计算器这样的工具编写

小程序或者js:字典或者数组字符串(toString的字符串)比较内容相同

例如比较"{'aa':1,'bb':2}"和 "{'bb':2,'aa':1}"两个字典字符串是否内容相同,或者比较两个数组字符串内容是否相同

ds_cfm的博客 2240

【GEE实战】Sen+MK趋势分析:从代码到地图,解锁植被变化时空密码

本文详细介绍了在Google Earth Engine(GEE)平台上使用Sen斜率估计和Mann-Kendall(MK)检验进行植被变化趋势分析的全流程。从遥感数据加载、Sen斜率计算到MK显著性检验,结合代码示例和实战经验,帮助读者掌握植被时空变化分析的实用技巧,为生态监测和环境保护提供数据支持。

weixin_42628688的博客 213

Web前端之动态执行JavaScrip、微信小程序无法使用eval和Function的解决办法、字符串表达式、字符串运算、数学计算、parseFloat、Function、pop

Web前端之动态执行JavaScrip、微信小程序无法使用eval和Function的解决办法、字符串表达式、字符串运算、数学计算、parseFloat、Function、pop

优快云博客主页地址:https://mengjian.blog.youkuaiyun.com/ 2665

用FSL的eddy_topup pipeline完整处理DTI数据:从原理到实战,搞定涡流和磁化率畸变

本文详细介绍了如何使用FSL的eddy_topup pipeline完整处理DTI数据,解决涡流和磁化率畸变问题。从原理到实战,涵盖了数据格式转换、脑提取、b0图像处理等关键步骤,并提供了acqparams.txt配置和eddy命令的详细解析,帮助研究人员高效完成DTI数据校正。

weixin_29235525的博客 281

linux入侵排查-综合日志分析

2.分析攻击者首次成功登录web管理后台的时间 还可以知道攻击者可能是通过10.2.4.11这个跳板服务器跳过来的,然后我们继续排查,可以发现日志中POST请求大多都是1047字节,然后往后大多是300字节,POST请求的响应状态码有200和302这两个,其中的302是爆破成功后持续爆破产生的日志,再1047字节和300字节中间夹着一个978字节,就是200响应和302响应的中间。7.分析攻击者留下的持久化后门的时间和后门执行情况 排查计划任务,发现有一个计划任务还是被加密的,应该是反弹shell的。

chinese_cabbage0的博客 642

【物联网开发】微信小程序实现字符串转化为变量名,替代eval()函数的功能

使用一种有效的方法实现字符串转化成变量名

weixin_46403492的博客 1242

微信小程序 - 详细解决map地图上使用自定义图标图片或自定义样式进行markers标记点,手机真机运行时安卓系统、苹果ios系统会出现不显示标记点的问题(大概率安卓正常显示标记点,但苹果就加载失败)

微信小程序,map,地图组件,安卓android,苹果ios,真机调试,marker,标记点,在地图上标记,突然就不显示白屏了没动代码,自定义标记点icon,label动态数字,小程序地图markers标记点显示不出来,微信小程序map组件,地图加载后marker标记点ios设备不显示,android正常显示,添加多个标记点。安卓能正常显示标记点图标,IOS设备不显示标记点图标,map地图白屏不显示标记,图标真机调试不显示,自定义图标,报错,页面白屏,不报错也不显示,无法加载,图片展示不出来,iconPat

✅ 精选推荐文章 5955

微信小程序eval无法使用的替代方案

eval是 JavaScript 中的一个函数,它可以将一个字符串作为 JavaScript 代码进行执行,但是在微信小程序中并不支持eval函数。

qq_33256701的博客 1894

联邦学习中的差分隐私保护详解及python实现

随着数据隐私法规(如 GDPR、CCPA)日益严格,传统将数据集中到云端训练模型的方式面临合规与安全风险。联邦学习通过让各客户端保留本地数据,仅共享模型更新,缓解了数据流动带来的隐私风险。但模型更新仍可能泄露个体信息。为进一步保障隐私,可在本地更新中引入差分隐私(DP)机制,通过向梯度或模型更新中注入随机噪声,防止反向推断原始数据citeturn0search9。

闲人编程的博客 1919

基于Simulink的光储系统黑启动能力仿真

本文基于Simulink平台构建了光储系统黑启动仿真模型,详细阐述了储能VF控制、光伏孤岛MPPT和同步并网等核心控制策略。通过分阶段协调控制(储能启动→关键负载→光伏接入→非关键负载→同步并网),实现了60秒内恢复供电、母线电压波动<5%的性能指标。仿真结果表明,协调控制策略相比无序启动可显著提升系统稳定性,避免电压崩溃和负载跳闸。文章还提供了完整的建模步骤、核心代码及进阶优化方向,为微电网应急供电设计提供了实用参考。该模型适用于光伏储能系统的黑启动能力验证和优化研究。

amy_mhd的博客 106

wx wxml判断字符串是否相等_leetCode175|检查两个字符串数组是否相等

一,检查两个字符串数组是否相等1,问题简述给你两个字符串数组 word1 和 word2 。如果两个数组表示的字符串相同,返回 true ;否则,返回 false 。数组表示的字符串 是由数组中的所有元素 按顺序 连接形成的字符串。2,示例描述示例 1:输入:word1 = ["ab", "c"], word2 = ["a", "bc"]输出:true解释:word1 表示的字符串为 "...

weixin_32925455的博客 1004

【WRF-Urban】WUDAPT详解:An Urban Weather, Climate, and Environmental Modeling Infrastructure

WUDAPT详解:An Urban Weather, Climate, and Environmental Modeling Infrastructure

WW、forever的博客 495

微信小程序 eval 替代(数学运算)支持小数点,支持uniapp,最新完全可用版!

最近有个开发计算器的需求,想着用eval很方便 =,= 小程序还给禁用了。去网上去搜 没有找到好用的解决办法(eval5 太大了,不优雅)。突然想到在大一看算法书时 有一个实现计算机的例子 话不多说上代码 :)

weixin_46382141的博客 1670

4.DJI-PSDK云台x-port控制:

使用PSDK 的“云台控制”功能,开发者需要先设计负载设备的云台并开发出控制云台的程序,将云台的控制函数注册到PSDK 指定的接口后,用户通过使用DJI Pilot、基于MSDK 开发的移动端App 及遥控器即可控制基于PSDK 开发的具有云台功能的负载设备,同时获得负载设备的相关信息,如姿态等。云台的姿态如 图2.云台姿态 所示,根据用户的控制指令,云台能够调整姿态;云台的关节如 图1.云台关节 所示,云台关节是云台上带动负载设备转动的结构件:云台电机,云台关节角即云台电机转动的角度。

哒宰的博客 855

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

如何在微信小程序中使用内置 JS 解释器(如 eval5、estime、evil-eval 等方式)

如何在微信小程序中使用内置 JS 解释器(如 eval5、estime、evil-eval 等)

m0_62373369的博客 1557

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

关于eval在微信小程序中无法使用的问题

关于eval在微信小程序中无法使用的问题引言一、eval5二、引入第三方工具Binding三、二叉树算法完成简单四则运算中缀表达式转换为后缀表达式(调度场算法) 引言 JavaScript中的eval函数是颇受开发者争议的问题之一,问题主要在于其可能导致的不安全性,因此它也遭到了微信官方的封禁。记得以前有些人想用eval实现热更新代码,而不用经过审核,封掉这类型的代码是正常的。但是,eval函数的优点也是很明显的。例如,使用JS编写一个计算器程序,在遇到"2+1-3*5"这样的字符串时,使用eval就可以很

zhiliao_aaa的博客 5864

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

相同位置字符串比较小程序

// 字符串1 $str1 = 'abcdef'; // 字符串2 $str2 = 'abefeg'; // 分数常量基数 const SCORE = 10; // 总分 $scoreSum = 0; // 重复次数 $repeatSum = 0; // str长度 $len = strlen($str1); // 循环 for ($i = 0; $i < $len; $i++) { //

微澜 2408

HbuilderX开发微信小程序,计算器完美解决eval函数不可用。

将这里的zl_calculator_zl.js保存到自己的项目中,导出和导入一下。HbuilderX开发微信小程序计算器,完美解决eval函数不能用的方法。只不过我自己改成Calculator了,在这里多谢原作者的无偿提供!由于上面是我的名字我给他截掉了,界面比较简单,可以在自己美化一下。此处的Calculator函数是自己定义的一个四则运算的函数。现在:zl_calculator_zl(“1+2+3+4”)在js文件最下面导出,我这里是改了函数名的。以前:eval(“1+2+3+4”)

qq_61786595的博客 1307

小程序 求两字符串中是否有相同字符

#include&lt;stdio.h&gt; #include bool fun(const char *a, const char *b,int len) { int m = 0; for (int i = 0;i &lt;len ;i++) { m = m^a[i] ^ b[i]; } if (m) return false; else return true; } int main() ...

qq_41257782的博客 3201

破解小程序禁止使用JS解释器动态执行JS(eval5、estime、evil-eval等)代码的终极解决方案

关于被小程序禁止使用eval函数的问题,大家都多少了解了,新规则已经限制死了。请看下面新规则。既然要求如此严格,那么有没有其它解决方案呢,所谓上有正常,下有对策。故今天这篇文章就是要提供新的思路实现动态执行js代码的方案。...

well2049的博客 3907

微信小程序变量的定义和使用

变量的定义和使用 在小程序中对应的.js文件里面的data区块定义变量,然后在对应的.wxml页面使用变量。下面通过案例来讲解。 .js文件中变量的定义示例如下: data: { myvar01: "我是变量01", myvar02: "我是变量02", }, WXML 中的动态数据均来自对应 Page 的 data。数据绑定使用双大括号将变量包起来。.wxml文件中变量的显示,...

杭州.黄老师 1万+

微信小程序如何判断对象是否为空、判断值是否存在

微信小程序如何判断定义的对象是否为空、如何判断对象中的未定义的值是否存在

Farel的博客 1万+

微信小程序——if条件判断

以在components文件下新建的IfComp 和pages文件下新建的features 为例。

weixin_58963766的博客 3214
上一篇: 微信小程序实现wxml中数据保留小数或取整
下一篇: 重拾Android之AS4.1 ButterKnife注解引入(最新)
盛国强
博客等级 码龄11年 105粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值