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

  操作符有如下几种,分项、支路和数字配合操作符可以自定义组合,例如 [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. petalinux 报错总结

    Failed to menu config project component.... 解决办法 此处是由于Terminal(终端)的界面太窄导致的,把Terminal(终端)界面拉宽即可:重新执行命 ...

  2. SQL server 批量删除表

    select 'drop table '+name+';' from sys.tables declare c cursor forselect NAME from sysobjects where ...

  3. 一文搞懂Maven配置,从此不再糊涂下载依赖(文末有成品)

    一般来说Maven都是配合着idea一起使用,下载依赖速度慢就去网上找个镜像配置一下,但总会遇到莫名其妙的问题,比如镜像源不生效.Error reading file pom.xml等等.今天详细讲解 ...

  4. 用友BIP全面预算

    全面预算是企业在经营过程中制定并实施的一种财务管理工具,它考虑了企业的各个方面,包括销售.采购.生产.财务.人力资源等,以全面的视角规划和控制企业的财务活动. 用友BIP全面预算数智化解决方案利用了& ...

  5. 【停用词】NLP中的停用词怎么获取?我整理了6种方法

    目录 一.停用词介绍 二.停用词应用场景 2.1 提取高频词 2.2 词云图 三.停用词获取方法 3.1 自定义停用词 3.2 用wordcloud调取停用词 3.3 用nltk调取停用词 3.3.1 ...

  6. 微信小程序关于小说类使用官方阅读器

    https://doc.weixin.qq.com/doc/w3_AAcAYAbdAFwpM63n1R5SIat3aa4cX?scode=AJEAIQdfAAoYHVCBbdAG4A1QYmAFQ 上 ...

  7. Clion代码自动格式化保存

    目录 前言 使用外部工具Artistic Style Clion 插件配置 注意 前言 使用Clion的时候,可以自动格式化代码的操作. 使用外部工具Artistic Style 序号 名称 地址 1 ...

  8. 胃食管反流之 SAP分析( in the Ohmega software)

    原文:https://note.youdao.com/s/GED6wise SAP analysis in the Ohmega software ohmega software 关于胃食管反流疾病 ...

  9. PHP 网络通信底层原理分析

    一.引言 我们日常的程序开发大多数都是以业务为主,很少会接触到底层逻辑.对于我们程序员来说,了解程序的底层运行逻辑,更有助于提升我们对程序的理解.我相信大多数的人,每天基本上都是完成业务需求.当然,完 ...

  10. HTML——标签元素的两大类

    块级标签(block) – 独占一行 内联标签(inline) – 按文本内容占位 div标签和span标签 <div>只是一个块级元素,并无实际的意义.主要通过CSS样式为其赋予不同的表 ...