记录vue和js操作——尽管很快实现了功能,可总感觉到不爽
需求产生的原因是:后端有一些数据是从旧平台直接迁移过来的,新平台需要根据迁移过来的数据,自动生产新的数据格式。


操作符有如下几种,分项、支路和数字配合操作符可以自定义组合,例如 [000000000001]+<00001>,带[号的表示type是branch,带<表示type是sub。
// 操作符列表
operatorList: [
'+',
'-',
'*',
'/',
'(',
')',
'inputNumber'
],
举例:[000000000001]+<00001>
解析为:
[{"type":"branch","name":"1#","value":92501,"electricAddr":"000000000001"},{"type":"+"},{"type":"sub","name":"电电电","value":69640,"number":"00001"}]
部分实现代码如下:
data () {
return {
// 操作符列表
operatorList: [
'+',
'-',
'*',
'/',
'(',
')',
'inputNumber'
],
filterOperator: [], //操作符过滤和排序列表
}
method:{
//操作符排序和过滤
geOoperatorFilter (expStr) {
let arr = this.operatorList.map(n => {
return { index: expStr.indexOf(n), val: n };
});
arr = arr.filter(f => f.index > -1);
arr.sort(this.sortId);
this.filterOperator = arr.map(m => {
return m.val
});
// console.log('this.filterOperator :>> ', this.filterOperator);
},
sortId (a, b) {
return a.index - b.index;//由低到高
},
// true:数值型的,false:非数值型
myIsNaN (value) {
return typeof value === 'number' && !isNaN(value);
},
//[000000000001]+[11101110011]-<1002>*<c3110>
reveserExpress (expStr) {
this.geOoperatorFilter(expStr);
let arr = [];
this.analysisData(arr, expStr);
// console.log('arr :>> ', arr);
let jsonArr = [];
arr.forEach(n => {
if (n.includes('[')) {
jsonArr.push({ "type": "branch", "name": "", "value": '', "electricAddr": n.replace('[', '').replace(']', '') });
}
if (n.includes('<')) {
jsonArr.push({ "type": "sub", "name": "", "value": '', "number": n.replace('<', '').replace('>', '') });
}
if (this.filterOperator.includes(n)) {
jsonArr.push({ "type": n });
}
//如果是个数字
if (this.myIsNaN(n)) {
jsonArr.push({ "type": 'number', "value": n });
}
});
// console.log('jsonArr :>> ', jsonArr);
this.form.expressionJson = JSON.stringify(jsonArr);
},
//是否包含分隔符
containOperator (word) {
return this.filterOperator.some(f => word.includes(f));
},
analysisData (arr, expStr) {
// debugger;
this.filterOperator.forEach(n => {
if (expStr.includes(n)) {
// debugger;
let tempArr = expStr.split(n);
tempArr.forEach((t, index) => {
//不包含分隔符
if (!this.containOperator(t) && !arr.includes(t)) {
// debugger;
arr.push(t);
if (index < tempArr.length - 1) {
arr.push(n);
}
} else {
// debugger;
this.analysisData(arr, t);
}
})
}
})
},
}
测试:
let expStr = '[000000000001]-[11101110011]/<1002>+<c3110>';
this.reveserExpress(expStr);
运行结果:
[{"type":"branch","name":"","value":"","electricAddr":"000000000001"},{"type":"-"},{"type":"branch","name":"","value":"","electricAddr":"11101110011"},
{"type":"/"},{"type":"sub","name":"","value":"","number":"1002"},{"type":"+"},{"type":"sub","name":"","value":"","number":"c3110"}]
虽然很快实现了功能,可是写这样的代码总感觉好恶心,可又不知道该怎么办?好想打人,可是没有发泄对象,只好扇自己一巴掌!
众里寻他千百度,猛一回头,卧艹,那人却在一个人过马路~
记录vue和js操作——尽管很快实现了功能,可总感觉到不爽的更多相关文章
- jquery.cookie.js 操作cookie实现记住密码功能的实现代码
jquery.cookie.js操作cookie实现记住密码功能,很简单很强大,喜欢的朋友可以参考下. 复制代码代码如下: //初始化页面时验证是否记住了密码 $(document).ready( ...
- vue+node.js+webpack开发微信公众号功能填坑——v -for循环
页面整体框架实现,实现小功能,循环出数据,整体代码是上一篇 vue+node.js+webpack开发微信公众号功能填坑--组件按需引入 修改部门代码 app.vue <yd-flexbox&g ...
- vue+node.js+webpack开发微信公众号功能填坑——组件按需引入
初次开发微信公众号,整体框架是经理搭建,小喽喽只是实现部分功能,整体页面效果 整个页面使用两个组件:布局 FlexBox,搜索框 Search,demo文档 http://vue.ydui.org/d ...
- vue.js操作元素属性
vue动态操作div的class 看代码: <!doctype html> <html lang="en"> <head> <meta c ...
- 2. Vue语法--插值操作&动态绑定属性 详解
目录 1. 设置vue模板 2. vue语法--插值操作 3. 动态绑定属性--v-bind 一. 设置vue模板 我们经常新建一个vue项目的时候, 会写如下的一段代码 <!DOCTYPE h ...
- JS操作select标签
主要利用这个来实现省市区三级联动的 我利用的是ajax,每一次onchange事件都改变相对应的select中的option,数据全是ajax请求服务器查询数据库而来的,效果还可以,在本地测试的时候速 ...
- 记录vue中一些有意思的坑
记录vue中一些有意思的坑 'message' handler took 401ms 在出现这个之前,我一直纠结于 是如何使用vue-router或者不使用它,通过类似的v-if来实现.结果却出现这个 ...
- 035——VUE中表单控件处理之使用vue控制select操作文字栏目列表
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- js操作history
js操作history pushState pushState只会在当前history中添加一条记录,并不会刷新浏览器 history.pushState({}, "my title&quo ...
- Node.js 操作Mongodb
Node.js 操作Mongodb1.简介官网英文文档 https://docs.mongodb.com/manual/ 这里几乎什么都有了MongoDB is open-source docum ...
随机推荐
- [FE] 浅谈 Chakra UI 的现代化浅封装 - 语义化大行其道
Web2.0 发展至今,网页元素越来越丰富和多样化,数据越来越多. 从需求上来说,也已经不再是展示简单个静态网页,高效的开发交互.打通后端数据,产生了 React 和 Vue 两个著名框架. Re ...
- WPF 已知问题 RadioButton 指定 GroupName 后关闭窗口可能导致无法选中
本文记录一个 WPF 已知问题,当 WPF 的 RadioButton 指定 GroupName 且将 IsChecked 状态绑定到 ViewModel 上,将包含以上控件的代码的窗口显示两个,接着 ...
- dotnet 在 UOS 国产系统上使用 MonoDevelop 进行拖控件开发 GTK 应用
先从一个 Hello World 应用开始,试试和古老的 WinForms 一样的拖控件式开发 在创建完成一个 GTK# 2.0 应用之后,咱可以试试开始拖控件的开发,当然这个开发方式开发出来的应用界 ...
- RT-Thead移植时缺少SystemCoreClockUpdate函数
一.问题 在移植 RT-Thead 时,需要获取mcu当前的 HCLK 时钟频率来设置滴答时钟,而我使用的库函数中刚好缺少SystemCoreClockUpdate函数. 我之前在RT-Thread移 ...
- Solution Set - 贪心和数据结构
感觉自己好菜啊,这个专题真的不太会. CF1439C Greedy Shopping Link&Submission. 容易发现,当此人连续买了一段物品之后,他的钱数至少减半.所以他最多只会买 ...
- 使用.NET源生成器(SG)实现一个自动注入的生成器
DI依赖注入对我们后端程序员来说肯定是基础中的基础了,我们经常会使用下面的代码注入相关的service services.AddScoped<Biwen.AutoClassGen.TestCon ...
- 《最新出炉》系列入门篇-Python+Playwright自动化测试-44-鼠标操作-上篇
1.简介 前边文章中已经讲解过鼠标的拖拽操作,今天宏哥在这里对其的其他操作进行一个详细地介绍和讲解,然后对其中的一些比较常见的.重要的操作单独拿出来进行详细的介绍和讲解. 2.鼠标操作语法 鼠标操作介 ...
- ansible(9)--ansible的yum模块
1. yum模块 功能:管理软件包,需要确认被管理端为红帽系列的,并且需要被管理端配置好yum源. 主要的参数如下: 参数 说明 name 指定安装软件包名或软件包URL state 指定yum对应的 ...
- Oracle中ALTER TABLE的五种用法(二)
首发微信公众号:SQL数据库运维 原文链接:https://mp.weixin.qq.com/s?__biz=MzI1NTQyNzg3MQ==&mid=2247485212&idx=1 ...
- 为什么 AI 时代更应该 Learn in Public
TL;DR Learn in Public 强调将学习到的知识 分享到公共空间,相较于纯输入式的学习有诸多好处.AI 工具极大降低了信息检索.整理.概括的门槛,使得输入信息更容易,但对我们真正掌握知识 ...