实现数据结构复制的一种思路
场景
项目中是基于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()

浙公网安备 33010602011771号