多组数据中多个字段唯一性验证

128 阅读1分钟

一、具体的业务问题

新建添加数据时,可以同时添加多组数据,每组数据中有三个字段联动来验证唯一性,并且这个三个字段还是可以输入多个。具体数据结构如下:

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. 重新组合数组 [[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. 获取二维数组的所有数据集合 [[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
}
  1. 判断数组里面是否存在重复项
function checkGroup(arr) {
  for (let i in arr) {
    if (arr.indexOf(arr[i]) != i) {
      return true
    }
  }
  return false
}