一、具体的业务问题
新建添加数据时,可以同时添加多组数据,每组数据中有三个字段联动来验证唯一性,并且这个三个字段还是可以输入多个。具体数据结构如下:
const arr = [
{
a: '',
b: '',
C: [],
D: [],
E: []
},
......
]
其中每个对象:C中的每一个元素、D中的每一个元素以及E的整体作为唯一性验证
// 存在重复项 1,3,[5,6]
const arr = [
{ C: [1,2], D: [3,4], E: [5,6] },
{ C: [1], D: [3], E: [5,6] }
]
// 不存在重复项
const arr = [
{ C: [1,2], D: [3,4], E: [5,6] },
{ C: [1,2], D: [3,4], E: [5,6,7] }
]
二、实现方法如下:
- 重新组合数组
[[1,2], [], [3,4], []] => [[1,2], [1], [3,4], [3]]=> 调用generateDataSets=> 调用checkGroup
function combineGroup(arr) {
let geneArr = []
for (let i in arr) {
let _newArr = []
for (let j in arr[i]) {
if (!Array.isArray(arr[i][j])) continue
if (arr[i][j].length == 0) {
arr[i][j].push(i) // 不同组的某个字段为空数组,赋不同的值
}
if (j == "E") {
_newArr.push([arr[i][j].sort().join("")])
} else {
_newArr.push(arr[i][j]);
}
}
const _geneArr = generateDataSets(_newArr)
geneArr = geneArr.concat(_geneArr)
}
return checkGroup(geneArr)
// 返回值为true 说明添加最新值后存在重复项,违背唯一性,不允许添加
// 返回值为false 说明添加最新值后没有重复项,不违背唯一性,允许添加
}
- 获取二维数组的所有数据集合
[[1,2], [3]] => [[1,3],[2,3]]
function generateDataSets(arr) {
let result = [];
function helper(subArr, currentSet) {
if (subArr.length == 0) {
result.push([...currentSet].join("")) // [[1,3],[2,3]] => [13,23]
return
} else {
for (let i = 0; i < subArr[0].length; i++) {
const newCurrentSet = [...currentSet]
newCurrentSet.push(subArr[0][i])
helper(subArr.slice(1), newCurrentSet)
}
}
}
helper(arr, [])
return result
}
- 判断数组里面是否存在重复项
function checkGroup(arr) {
for (let i in arr) {
if (arr.indexOf(arr[i]) != i) {
return true
}
}
return false
}