myEval

  1. export const evalExp = /[!\&\|\+\-\*\%=\/<\>\^\(\)\~\:\?\;]/g;
  2. export function myEval(originString: string, context: any) {
  3. if (!context) return;
  4. let bindKey = originString;
  5. bindKey = bindKey.replace(evalExp, " ");
  6. let bindKeys = bindKey
  7. .split(" ")
  8. .map(s => s.trim())
  9. .filter(e => !!e)
  10. .filter(e => {
  11. if (/^['"`]/.test(e)) {
  12. return false;
  13. }
  14. // 过滤布尔值
  15. if (e === "true" || e === "false") {
  16. return false;
  17. }
  18. // 过滤number
  19. if (!isNaN(+e)) {
  20. return false;
  21. }
  22. return true;
  23. });
  24. let args = bindKeys.map(s => {
  25. if (/\./.test(s) && /\[|\]/g.test(s)) {
  26. let aindex = s.indexOf(".");
  27. let bindex = s.indexOf("[");
  28. let index = Math.min(aindex, bindex);
  29. let obj = s.substr(0, index);
  30. return obj;
  31. } else if (/\./.test(s)) {
  32. let aindex = s.indexOf(".");
  33. let obj = s.substr(0, aindex);
  34. return obj;
  35. } else if (/\[|\]/g.test(s)) {
  36. let bindex = s.indexOf("[");
  37. let obj = s.substr(0, bindex);
  38. return obj;
  39. }
  40. return s;
  41. });
  42. args = toArray(new Set(args));
  43. const newArgs: string[] = [];
  44. let datas = args.map((k) => {
  45. if (k in context) {
  46. newArgs.push(k)
  47. return context[k]
  48. }
  49. }).filter(e => !!e);
  50. if (!datas.length) return;
  51. let funbody = `return function(${newArgs.toString()}) {
  52. 'use strict';
  53. ${originString};
  54. }`;
  55. return Function(funbody)()(...datas);
  56. }

evalFun

  1. export function evalFun(bindKey: string, data: any) {
  2. if (undefinedp(data)) return;
  3. try {
  4. const r = Function(`with(this){ return ${bindKey} }`).apply(data, arguments)
  5. return r === '' ? undefined : r;
  6. } catch (error) {
  7. }
  8. }

setData

  1. export function setData(key: string, newValue: any, contextData: ContextData) {
  2. if (!stringp(key)) return null;
  3. return Function(`return function(d) {
  4. with(this){
  5. ${key} = d;
  6. }
  7. }`)().call(contextData.store, newValue);
  8. }

解析js字符串的更多相关文章

  1. 全面解析JS字符串和正则表达式中的match、replace、exec等函数

    转自:https://www.jb51.net/article/87730.htm 正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串.将 ...

  2. 《JS高级程序设计》笔记 —— 解析查询字符串

    今天在继续翻阅<JS高级程序设计>的时候,正好翻到location对象这一小节,其中有一部分就是讲的解析查询字符串.看到这个内容立马想到了做去哪儿秋招笔试题的时候有这么一道题. 去哪儿笔试 ...

  3. js字符串转日期,js字符串解析成日期,js日期解析, Date.parse小时是8点,Date.parse时间多了8小时

    js字符串转日期,js字符串解析成日期,js日期解析, Date.parse小时是8点,Date.parse时间多了8小时 >>>>>>>>>&g ...

  4. JS的全局函数eval解析JSON字符串

    JavaScript eval() 函数 定义和用法 eval() 函数可计算某个字符串,并执行其中的的 JavaScript 代码. 语法 eval(string) 参数 描述 string 必需. ...

  5. js中解析json对象:JSON.parse()用于从一个字符串中解析出json对象, JSON.stringify()用于从一个对象解析出字符串。

    JSON.parse()用于从一个字符串中解析出json对象. var str = '{"name":"huangxiaojian","age&quo ...

  6. js字符串解析与转换成数字

    解析允许字符串中含有非法数字字符,解析按从左至右的顺序,如果遇到非数字字符就停止.而转换不允许出现非数字字符,否则会失败并返回NaN

  7. 浅解析js中的对象

    浅解析js中的对象 原文网址:http://www.cnblogs.com/foodoir/p/5971686.html,转载请注明出处. 前面的话: 说到对象,我首先想到的是每到过年过节见长辈的时候 ...

  8. C# 解析js方法,并调用js方法

    本文转载:http://www.cnblogs.com/StudyLife/archive/2013/03/11/2953516.html 本文不是基于B/S的 后台调用前台js方法,而是给你一段js ...

  9. js 字符串截取函数substr,substring,slice之间的差异

    js 字符串的截取,主要有三个函数,一般使用三个函数:substr,substring,slice. 而这三个函数是不完全一样的,平时很难记住,在这里做下笔记,下次遇到的时候,直接从这里参考,调用合适 ...

随机推荐

  1. 在Centos7上安装Python+Selenium+Firefox+Geckodriver

    1.事先准备好Centos7的系统 Centos系统是CentOS Linux release 7.4.1708 (Core) 查看Centos内核版本命令cat /etc/centos-releas ...

  2. 三:SpringBoot-配置系统全局异常映射处理

    三:SpringBoot-配置系统全局异常映射处理 1.异常分类 1.1 业务异常 1.2 系统异常 2.自定义异常处理 2.1 自定义业务异常类 2.2 自定义异常描述对象 2.3 统一异常处理格式 ...

  3. 前台console调试技巧

    前台console调试技巧 一.console.log() 二.console.warn() 三.console.dir() 四.console.table() 五.console.assert() ...

  4. SparkStreaming直连方式读取kafka数据,使用MySQL保存偏移量

    SparkStreaming直连方式读取kafka数据,使用MySQL保存偏移量 1. ScalikeJDBC 2.配置文件 3.导入依赖的jar包 4.源码测试 通过MySQL保存kafka的偏移量 ...

  5. scala之map,List,:: , +:, :+, :::, +++操作

    scala之map,List操作 1.Map操作 2.List操作 2.1Demo1 2.2Demo2 3.:: , +:, :+, :::, +++ 1.Map操作 Map(映射)是一种可迭代的键值 ...

  6. HttpClient之基本使用

    1.HttpClient简介 http协议可以说是现在Internet上面最重要,使用最多的协议之一了,越来越多的java应用需要使用http协议来访问网络资源,特别是现在rest api的流行,Ht ...

  7. Spring Boot 之遇见JSON

    MVC框架中,Spring Boot内置了jackson来完成JSON的序列化和反序列化操作,并且,在与其他技术集成的时候,如Redis.MongoDB.Elasticsearch等对象序列化,都可使 ...

  8. linux系统命令(调试命令)(nmtui,ip a、ss、ps、uptime、top、lsof、grep,iotop、iftop)

    本章命令 0 1 2 3 4 5 6 7 8 9 10 nmtui ip a ss ps uptime top lsof grep iotop iftop tsar nmtui 图形化管理网卡命令 依 ...

  9. 全网最硬核 JVM TLAB 分析(单篇版不包含额外加菜)

    今天,又是干货满满的一天.这是全网最硬核 JVM 系列的开篇,首先从 TLAB 开始.由于文章很长,每个人阅读习惯不同,所以特此拆成单篇版和多篇版 全网最硬核 JVM TLAB 分析(单篇版不包含额外 ...

  10. Hadoop----hdfs dfs常用命令的使用

    用法    -mkdir    创建目录    Usage:hdfs dfs -mkdir [-p] < paths>    选项:-p    很像Unix mkdir -p,沿路径创建父 ...