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命令将 ...
随机推荐
- <二>JMeter/Navicat for MYSQL运行案例
一.JMeter 1. 下载地址:http://jmeter.apache.org/download_jmeter.cgi 2. 选择适合的版本进行下载,如下: 3. 将下载好的压缩包解压到任意文件夹 ...
- LCP 34. 二叉树染色
class Solution: def maxValue(self, root: TreeNode, k: int) -> int: def dfs(root): # 空节点价值全为0 res ...
- OPENSSL 生成RSA公钥、私钥和证书
在命令窗口执行下列操作. 1)生成RSA私钥: openssl genrsa -out rsa_private_key.pem 2048 生成内容: -----BEGIN RSA PRIVATE KE ...
- esxi 6.7手动安装阵列卡驱动()2023-01.03
一.登录vmware后台在兼容性列表里面查找驱动,https://www.vmware.com/resources/compatibility/search.php 二. 下载对应的驱动https:/ ...
- centos7(虚拟机)下安装redis
centos7(虚拟机)下安装redis 安装 下载redis安装包 wget https://download.redis.io/releases/redis-6.2.1.tar.gz 解压安装包 ...
- centos7中通过源码安装postgresql13.6
下载地址:https://www.postgresql.org/ftp/source/ 0.安装相关依赖库 centos依赖包下载地址:https://developer.aliyun.com/pac ...
- testNG框架之我见
testNG框架中会有一个xml文件夹,里面放xml文件,之后必须要在pom文件中配置 xml文件中有一个suite,在suite中可以配置parameter参数.test用例,还可以添加listen ...
- 跨域获取iframe页面的url
一:跨域获取iframe页面的url 1.在使用iframe页面的js添加以下内容 <script> var host = window.location.href; var histor ...
- Centos7下搭建部署DoClever接口管理平台
项目地址: github:https://github.com/sx1989827/DOClever 码云:https://gitee.com/sx1989827/SBDoc 1.根据官方文档,先安装 ...
- mysql创建数据库,用户,授权基操
# 创建数据库create database test; # 创建用户并设置密码 create user 'test'@'%' identified by '123456';# 设置密码SET PAS ...