需求产生的原因是:后端有一些数据是从旧平台直接迁移过来的,新平台需要根据迁移过来的数据,自动生产新的数据格式。

  操作符有如下几种,分项、支路和数字配合操作符可以自定义组合,例如 [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操作——尽管很快实现了功能,可总感觉到不爽的更多相关文章

  1. jquery.cookie.js 操作cookie实现记住密码功能的实现代码

    jquery.cookie.js操作cookie实现记住密码功能,很简单很强大,喜欢的朋友可以参考下.   复制代码代码如下: //初始化页面时验证是否记住了密码 $(document).ready( ...

  2. vue+node.js+webpack开发微信公众号功能填坑——v -for循环

    页面整体框架实现,实现小功能,循环出数据,整体代码是上一篇 vue+node.js+webpack开发微信公众号功能填坑--组件按需引入 修改部门代码 app.vue <yd-flexbox&g ...

  3. vue+node.js+webpack开发微信公众号功能填坑——组件按需引入

    初次开发微信公众号,整体框架是经理搭建,小喽喽只是实现部分功能,整体页面效果 整个页面使用两个组件:布局 FlexBox,搜索框 Search,demo文档 http://vue.ydui.org/d ...

  4. vue.js操作元素属性

    vue动态操作div的class 看代码: <!doctype html> <html lang="en"> <head> <meta c ...

  5. 2. Vue语法--插值操作&动态绑定属性 详解

    目录 1. 设置vue模板 2. vue语法--插值操作 3. 动态绑定属性--v-bind 一. 设置vue模板 我们经常新建一个vue项目的时候, 会写如下的一段代码 <!DOCTYPE h ...

  6. JS操作select标签

    主要利用这个来实现省市区三级联动的 我利用的是ajax,每一次onchange事件都改变相对应的select中的option,数据全是ajax请求服务器查询数据库而来的,效果还可以,在本地测试的时候速 ...

  7. 记录vue中一些有意思的坑

    记录vue中一些有意思的坑 'message' handler took 401ms 在出现这个之前,我一直纠结于 是如何使用vue-router或者不使用它,通过类似的v-if来实现.结果却出现这个 ...

  8. 035——VUE中表单控件处理之使用vue控制select操作文字栏目列表

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  9. js操作history

    js操作history pushState pushState只会在当前history中添加一条记录,并不会刷新浏览器 history.pushState({}, "my title&quo ...

  10. Node.js 操作Mongodb

    Node.js 操作Mongodb1.简介官网英文文档  https://docs.mongodb.com/manual/  这里几乎什么都有了MongoDB is open-source docum ...

随机推荐

  1. [Blockchain] Cosmos Starport 101 - 为你的新数据类型 生成代码

    # 项目模板 $ starport app github.com/hello/planet --address-prefix your_new_prefix 项目目录结构的说明看这里: https:/ ...

  2. [Blockchain] Cosmos Starport 安装的三种方式

    官方二进制包方式: # 下载 starport 二进制到 /usr/local/bin $ curl https://get.starport.network/starport! | bash   # ...

  3. C#类型后加问号?

    C# 可空类型(Nullable)说明_w3cschool 细说Nullable<T>类型 - Sweet-Tang - 博客园 (cnblogs.com) 值类型变量不能null,加问号 ...

  4. dotnet 是否应该对 HttpResponseMessage 调用 Dispose 进行释放

    对于 HttpClient 的请求响应值 HttpResponseMessage 来说,既然继承了 IDisposable 接口,自然就是想让大家可以通过 using 或者手动调用 Dispose 进 ...

  5. Ubuntu 20.04版本安装k8s控制节点与控制节点升级

    一.环境配置 服务器配置:2核4G IP:192.168.10.23 主机名:master4将改主机加入此 集群 # 1.修改主机名 hostnamectl set-hostname master4 ...

  6. Competition Set - AtCoder II

    这里记录的是这个账号的比赛情况. ABC310 2023-7-15 Solved:6/8 1973->2053 七场ABC,两场打得蛮烂的,都因为AT炸掉Unrated了:另外五场全部满Perf ...

  7. 【GUI软件】小红书按关键词采集笔记详情,支持多个关键词,含笔记正文、转评赞藏等

    目录 一.背景介绍 1.1 爬取目标 1.2 演示视频 1.3 软件说明 二.代码讲解 2.1 爬虫采集-搜索接口 2.2 爬虫采集-详情接口 2.3 cookie说明 2.4 软件界面模块 2.5 ...

  8. 国外anonfiles网盘大文件下载器

    各位注意了,这个网站很久以前是可以国内直接访问的,后来被墙了,但仍然可以使用代理下载,现如今,6天前大概2023年8月10号左右这个网站已经挂了,就是彻底不能用了,所有与之有关的东西比如网页,都是假的 ...

  9. 渐变颜色css设置

    小说付费章节渐变颜色配置 position: absolute; top: 0; left: 0; width: 100%; height: 211px; transform: translateY( ...

  10. 一个网格合并(weld)小工具

    在日常开发中会有需求合并多个Mesh网格,并且它们重合处的顶点也要合并,而并非合并成两个subMesh. 而近期刚好在学习Geomipmap的细分,需要把多个mesh块进行合并,于是写了这个脚本 (简 ...