eval有时候也可以用,而且有奇效
eval,一个我曾经避之不及的函数,最近我对它产生了一点新的感触:eval有时候也可以用,有奇效。
一般在使用js进行开发时,是不建议使用eval这类函数的。在JavaScript中,eval可以计算传入的字符串,将其当作js代码来执行。因为它可执行js代码的特性,有可能被第三方利用,传入恶意js代码执行,因此这个函数存在安全风险。再加上eval执行的速度低于普通的js程序,因此在日常开发中,它的使用准则是“能不用就不用”、“代码中使用eval是很丑陋的一件事”。
但是这次在做拉线功能时,我“不得不”使用了它。
拉线由于数据量小,可以通过矢量渲染的方式渲染到地图上,但是通过geoserver获取的坐标数据和样式数据是分离的,且没有样式名能将二者关联起来。
样式数据里面规定每组筛选条件对应一组颜色值(线段的颜色、宽度,面的颜色、透明度),以以下这段样式数据为例:
{
"Description": {
"Title": "hidetitle"
},
"Filter": {
"And": {
"PropertyIsGreaterThanOrEqualTo": {
"PropertyName": "rsrp_rate",
"Literal": "0"
},
"Not": {
"PropertyIsNull": {
"PropertyName": "eci"
}
},
"PropertyIsEqualTo": {
"PropertyName": "geo_type",
"Literal": "cell"
},
"PropertyIsLessThanOrEqualTo": {
"PropertyName": "rk",
"Literal": "3"
},
"PropertyIsLessThan": {
"PropertyName": "rsrp_rate",
"Literal": "0"
}
}
},
"PolygonSymbolizer": {
"Fill": {
"SvgParameter": [
"#f56e3f",
"0.15"
]
},
"Stroke": {
"SvgParameter": [
"#f56e3f",
"4"
]
}
},
"Name": "cell1-3 and rate 0-20"
},
它的涵义是:
当满足(rsrp_rate >= 0 && ect !== null && geo_type === 'cell' && rk < 3 && rsrp_rate < 0) 的条件时,面填充颜色使用#f56e3f、透明度为0.15,线段颜色使用#f56e3f、宽度为4。
如果使用常规方式去进行拉线数据值和样式数据的计算匹配,无疑会很繁琐,执行筛选所需要的时间也会很长,这种结果无疑是“丑陋”的。但是如果使用eval,就会有奇效。
我可以先将样式数据进行处理成类似
{ operator: '>=', name: 'rsrp_rate', value: 0 }
这样的结构,并存入数组,这个数组里存放的都是and关系的筛选条件。
然后从拉线数据里获取每个指标的值indexValue,进行如下拼装:
let dataItem = { operator: '>=', name: 'rsrp_rate', value: 0 };
let filterValue = dataItem.value;
eval('filterValue' + dataItem.operator + 'indexValue') // indexValue是从拉线数据中获取的某个指标的值
// 上方这行代码在编译后执行的是: filterValue >= indexValue
利用eval可以将传入的字符串当作js语句执行的特性,我就可以得到一个条件判断结果,代码相对而言也简洁很多,使用eval,反尔让代码变得优雅,大大提高了数据匹配的效率和代码的可维护性。
总之,这段开发经历,让我对eval有了新的认识。
eval有时候也可以用,而且有奇效的更多相关文章
- Python2.2-原理之类型和运算
此节来自于<Python学习手册第四版>第二部分 一.Python对象类型(第4章) 1. Python可以分解成模块.语句.表达式以及对象:1.程序由模块构成:2.模块包含语句:3.语句 ...
- js django 数据互动
后台传输到客户端的数据怎么跟js进行互动 eval("("+{{data|safe}}+")") 获取到的数据可以直接使用 eval 有时候会存在编码问题所以推 ...
- python字符串与字典转换
经常会遇到字典样式字符串的处理,这里做一下记录. load load针对的是文件,即将文件内的json内容转换为dict import json test_json = json.load(open( ...
- [转]javascript eval函数解析json数据时为什加上圆括号eval("("+data+")")
javascript eval函数解析json数据时为什么 加上圆括号?为什么要 eval这里要添加 “("("+data+")");//”呢? 原因在于: ...
- JavaScript中Eval()函数的作用
这一周感觉没什么写的,不过在研究dwz源码的时候有一个eval()的方法不是很了解,分享出来一起学习 -->首先来个最简单的理解 eval可以将字符串生成语句执行,和SQL的exec()类似. ...
- ajax for in eval()知识点的应用
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- linux之eval用法(高级bash程序员的必修之技)
1. eval command-line 其中command-line是在终端上键入的一条普通命令行.然而当在它前面放上eval时,其结果是shell在执行命令行之前扫描它两次.如: pipe=&qu ...
- <%# Convert.ToDecimal(Eval("IMLognum")).ToString("F0") %>
数据绑定转类型 <%# Convert.ToDecimal(Eval("IMLognum")).ToString("F0") %> 在项目中绑定数据 ...
- $parse/$eval和$observe/$watch如何区分
大家在看angular的时候,有时候偶尔会看到$parse,$eval和$observe,$watch这两对语法,随着深入使用angular,就不可避免使用到它.文章从内部运行机制跟实际需求的角度来解 ...
- linux eval命令
eval 功能说明:重新运算求出参数的内容.语 法:eval [参数]补充说明:eval可读取一连串的参数,然后再依参数本身的特性来执行.参 数:参数不限数目,彼此之间用分号分开. 1.eval命令将 ...
随机推荐
- SQL-分组聚合-子查询
-- having前面必须有group byselect e.deptno ,sum(e.sal) as sum_sal ,min(e.sal) as min_sal ,max(e.sal) as m ...
- 关于CSS3中的min-height等的使用
一.min-height 当我们需要让某个容器不能低于某个高度,但是不能将高度固定在这个高度,希望其能够随着容器内内容的增多而变高时,我们可以对容器设置一个min-height来让该容器获得该特性.( ...
- 2020.3.9 ~ 2020.3.15 ACM训练周总结
一.本周ACM学习相关内容 学习了dfs和bfs -- 4小时 课上系统的学习了vector等stl函数的使用即注意事项-3小时 二.题数与耗时 师哥安排了12道题,做了五道(不包含比赛题):大概4个 ...
- 利用fread读取二进制文件的bug
最近在做一个项目时需要读取二进制文件,我用C语言的fread进行读取,代码如下: FILE *fp; int read_data; fopen_s(&fp, file_path, " ...
- Laravel自定义JSON错误消息 The given data was invalid.
Laravel自定义错误消息 在Laravel验证请求时出现错误,默认会返回如下的错误: 可以看到JSO结构中的message为The given data was invalid.而并非是我们具体自 ...
- StatefulSet 模板,更新,扩缩容,删除
概念: StatefulSet是用来管理有状态应用的工作负载API对象,kubectl 中可以简写sts ,sts每一个pod生成一个唯一的标识符,sts_name-number,number从0开始 ...
- 2.javaweb-begin
1.回顾前端知识 1.CSS 1) CSS的角色:页面显示的美观风格 2) CSS的基础语法:标签样式:类样式:ID样式:组合样式:嵌入式样式表:内部样式表:外部样式表 3) 盒子模型:border. ...
- STM32使用DMA接收不定长数据
开启串口,是能串口全局中断 配置DMA并勾选Memory选项 继续配置工程并且生成代码 添加一些串口通讯使用的全局变量 #define BUFFER_SIZE 128 uint8_t Tx_Buf[5 ...
- linux使用iperf3测试带宽
1. https://www.alibabacloud.com/help/zh/express-connect/latest/test-the-performance-of-an-express-co ...
- python-魔法函数-__str__ __repr__ 的一次异常
# encoding: utf-8import loggingERROR_NOT_FOUNDED_FILE = "error_not_founded_file"class Gene ...