实现数据结构复制的一种思路

场景

项目中是基于blockly组装的sql,实现了数据交换的功能,图示,整个规则结构由前端组装成了一个对象,现在要实现对该规则的复制

 

思路

在拷贝该规则时,先过滤掉数据里面的所有的id

在黏贴时,根据不同页面(变量、字段、提交值等不一样),过滤掉无效值,追加到list列表,提交时给到接口就可以了

代码实现

拷贝时过滤id

 

function filterObjId(obj) {
    for (let k in obj) {
      if ($.isArray(obj[k])) {
        obj[k].forEach((v, i) => {
          if ($.isPlainObject(v)) {
            filterObjId(v)
          }
        })
      } else if ($.isPlainObject(obj[k])) {
        console.log(k, obj[k])
        filterObjId(obj[k])
      } else {
        if (k === 'id') delete obj[k]
      }
    }
  }
const newItem = _.cloneDeep(targeItem)
filterObjId(newItem)

 

黏贴时过滤无效值  DoSqlRuleItemFilter.js

class DoSqlRuleItemFilter {
  constructor() {
    this.validIdSets = [] 
  }
  // 初始化要匹配的当前页面的目标集合id:包括 数据表的filed  当前页面变量  当前页面提交值  统计规则  运算规则
  init(self) {
    this.validIdSets = []
    this.setTableFiledid(self) 
    this.setVariableId(self)
    this.setSubmitValueId()
    this.setStatsRuleId()
    this.setCalcRuleId(self)
  }
/*
* 过滤无效字段
* 正则匹配相关字段 方法:getIds(),获取所有要验证的id
* 循环验证的id列表,是否在目标集合id中包含,如果不包含 - 正则全部替换为空
* 返回经过滤的对象,即为生成的黏贴数据结构
*/ filter(item) { let str = JSON.stringify(item) const ids = this.getIds(item) ids.forEach(id => { if (id.toString().length > 16 && this.validIdSets.includes(id) === false) { const reg = new RegExp(id, 'g') str = str.replace(reg, '') } }) const newItem = JSON.parse(str) return newItem } // 获取要验证的id getIds(item) { const str = JSON.stringify(item) let regFieldId = /"fieldId":".*?"/g let fieIdArr = str.match(regFieldId) || [] let regRefId = /"refId":".*?"/g let refIdArr = str.match(regRefId) || [] let regVal = /"val":".*?"/g let valArr = str.match(regVal) || [] const arr = [...fieIdArr, ...refIdArr, ...valArr] let ids = JSON.stringify(arr).replace(/fieldId/g, '').replace(/refId/g, '').replace(/val/g, '').replace(/\\\"/g, '').replace(/\:/g, '') ids = JSON.parse(ids) return Array.from(new Set(ids)) } } // 导出单例,方便直接使用 export default new DoSqlRuleItemFilter()

  

 

posted @ 2021-10-31 11:11  卷叶小树  阅读(132)  评论(0)    收藏  举报