myEval

export const evalExp = /[!\&\|\+\-\*\%=\/<\>\^\(\)\~\:\?\;]/g;
export function myEval(originString: string, context: any) {
if (!context) return;
let bindKey = originString;
bindKey = bindKey.replace(evalExp, " ");
let bindKeys = bindKey
.split(" ")
.map(s => s.trim())
.filter(e => !!e)
.filter(e => {
if (/^['"`]/.test(e)) {
return false;
} // 过滤布尔值
if (e === "true" || e === "false") {
return false;
} // 过滤number
if (!isNaN(+e)) {
return false;
}
return true;
});
let args = bindKeys.map(s => {
if (/\./.test(s) && /\[|\]/g.test(s)) {
let aindex = s.indexOf(".");
let bindex = s.indexOf("[");
let index = Math.min(aindex, bindex);
let obj = s.substr(0, index);
return obj;
} else if (/\./.test(s)) {
let aindex = s.indexOf(".");
let obj = s.substr(0, aindex);
return obj;
} else if (/\[|\]/g.test(s)) {
let bindex = s.indexOf("[");
let obj = s.substr(0, bindex);
return obj;
}
return s;
});
args = toArray(new Set(args));
const newArgs: string[] = [];
let datas = args.map((k) => {
if (k in context) {
newArgs.push(k)
return context[k]
}
}).filter(e => !!e); if (!datas.length) return;
let funbody = `return function(${newArgs.toString()}) {
'use strict';
${originString};
}`;
return Function(funbody)()(...datas);
}

evalFun

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

setData

export function setData(key: string, newValue: any, contextData: ContextData) {
if (!stringp(key)) return null;
return Function(`return function(d) {
with(this){
${key} = d;
}
}`)().call(contextData.store, newValue);
}

解析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. odoo-nginx 配置之80端口

    1 upstream odoo { 2 server 127.0.0.1:8069 weight=1 fail_timeout=0; 3 } 4 5 upstream odoo-im { 6 serv ...

  2. Excel 常用数据类型、自定义格式、特殊值等等

    常用数据类型: 常规: 常规单元榴格式不包含慑拍H靛的数字格式. 数值: 可以设置小数位数,是否使用千位分割符,以及负数样式 货币: 可以设置小数位数,货币符号,以及负数样式 会计专用: 可以设置小数 ...

  3. Docker中运行nginx

    Docker中运行nginx 1.Docker中运行nginx 2.配置文件 2.1 nginx.conf 2.2 default.conf 3.docker的镜像可以挂什么卷 部分内容原文地址: C ...

  4. ubuntu下scala下载+集成IDEA开发环境

    环境须知: ubuntu 16.04 scala 2.11.0 jdk 1.8.0 Idea 2016.3 JDK环境安装 (1)安装jdk, 注意scala很好的支持jdk 1.8 的jvm 编译环 ...

  5. ifndef /define/ endif 作用和用法

    问题:ifndef/define/endif"主要目的是防止头文件的重复包含和编译====================================================== ...

  6. CCF CSP 202009-2 风险人群筛查

    202009-2 风险人群筛查 题目背景 某地疫情爆发后,出于"应检尽检"的原则,我们想要通知所有近期经过改高危区域的居民参与核酸检测. 问题描述 想要找出经过高危区域的居民,分析 ...

  7. 【疯狂挖坑】linux服务器尝试中的问题(nohup等)

    实验环境:Ubuntu 16.0.4 首当其冲: 1. nohup使用及究极重要事项 我们用服务器肯定都是想在服务器存点什么.让服务器帮我们干点什么,这时候就需要nohup(no hang up)提供 ...

  8. 最小生成树-Prim&Kruskal

    Prim算法 算法步骤 S:当前已经在联通块中的所有点的集合 1. dist[i] = inf 2. for n 次 t<-S外离S最近的点 利用t更新S外点到S的距离 st[t] = true ...

  9. Educational Codeforces Round 67 E.Tree Painting (树形dp)

    题目链接 题意:给你一棵无根树,每次你可以选择一个点从白点变成黑点(除第一个点外别的点都要和黑点相邻),变成黑点后可以获得一个权值(白点组成连通块的大小) 问怎么使权值最大 思路:首先,一但根确定了, ...

  10. HOJ1867 经理的烦恼

    My Tags   (Edit)   Source : HCPC 2005 Spring   Time limit : 2 sec   Memory limit : 32 M Submitted : ...