需求:
保存的数据中 月份 + 编码 不能重复(单独的月份或编码重复 可以提交)
一、笨方法:
hasRepeatData(params, propArr){
for (let i = 0; i < params.length; i++) {
for (let j = i+1; j < params.length; j++) {
let isRepeatArr = []
for (let index = 0; index < propArr.length; index++) {
const element = propArr[index]
console.log("🚀 ~ file: index.vue:701 ~ checkData ~ element", element)
console.log("🚀 ~ file: index.vue:704 ~ checkData ~ params[j][element]", params[j][element])
console.log("🚀 ~ file: index.vue:704 ~ checkData ~ params[i][element]", params[i][element])
if (params[i][element] === params[j][element]) {
isRepeatArr.push(true)
} else {
isRepeatArr.push(false)
}
}
console.log("🚀 ~ file: index.vue:705 ~ isAllRepeat ~ isRepeatArr", isRepeatArr)
let isAllRepeat = isRepeatArr.every(item => {
return item === true
})
console.log("🚀 ~ file: index.vue:705 ~ isAllRepeat ~ isAllRepeat", isAllRepeat)
if (isAllRepeat) {
return true
}
}
}
使用如下:
this.hasRepeatData(selection, ['monthBs','codeBS'])
‘selection’为选中数组, ['','',...],为需要合并校验的字段,此法需将所有选中数组循环两次,并还要循环要校验的参数数组,很不方便。
没有重复数据 返回 undefined;
有重复数据,返回 true。
二、不冗长的方法:
checkRepeatData(params, propArr){
let obj = {}
let flag = params.every((ele) => {
console.log("🚀 ~ file: index.vue:445 ~ flag ~ ele:", ele)
if(ele.isDel === '1') return true // 删除的行,就跳过不进行校验
let key = ''
propArr.forEach(k=>{
key += ele[k] // 将需要校验的字段合并为一个字段
})
console.log("🚀 ~ file: index.vue:723 ~ params.every ~ key", key)
console.log("🚀 ~ file: index.vue:726 ~ params.every ~ obj[key]", obj[key])
if (!obj[key]) { // 若 obj[key],不存在(undefined),则给obj[key]赋值1,返回true,继续查找下一个直至最后一个
obj[key] = 1
return true
} else { // 找到重复的数据(obj[k]===1),返回false, 停止查找
return false
}
})
console.log("🚀 ~ file: index.vue:733 ~ flag ~ flag", flag)
return !flag
},
使用如下:
this.checkRepeatData(selection, ['monthBs','codeBS'])
‘selection’为选中数组, ['','',...],为需要合并校验的字段,此法只需将选中数组循环一次,且只要有一个不符合条件,就会停止查找,不一定会走完全部。
没有重复数据返回 false;
有重复数据 返回 true;
使用every() 只要有一个不符合条件,就会停止查找,不一定会走完全部。