数组相关计算

115 阅读1分钟

计算多个数组的交集

计算多个数组的交集时,先计算前连个数组的交集,将得到的结果与剩下的数据进行计算。 这里可以使用递归或循环。

/**
 * 计算数组的交集
 * @param args 
 */
function computeIntersection(...args: any[]):any[]{
  if(args.length <= 1){
    return args
  }
  let tempResult: any[] = []
  for(let i = 0; i < args[0].length; i++){
    if(args[1].includes(args[0][i]) && !tempResult.includes(args[0][i])){
      tempResult.push(args[0][i])
    }
  }
  args.splice(0, 2, tempResult)
  return computeIntersection(...args)[0]
}

const a = [1,2,3,4]
const b = [2,4,5,6,7]

console.log(computeIntersection(a,b))

计算两个数组的差值

在数学中,对于给定两个集合,将存在于低于集合而第二个集合不存在的元素组成的集合称为两个集合的差集

function computeDifference(subtraction: any[], minuend: any[]){
 if(!subtraction.length){
   return minuend
 }
 if(!minuend.length){
   return subtraction
 }
 return minuend.filter((item:any)=>{
   return !subtraction.includes(item)
 })
}

计算多个数组的并集

对于给定的两个集合,返回一个包含两个集合中所有元素的新集合。在数学中,集合中不存在重复元素

function computeUnion(...args: any[]): any[]{
  return Array.from(new Set(args.reduce((accu, curr)=> accu.concat(curr), args[0])))
}

子集关系判断

子集:集合 A 中的所有元素都在集合 B 中存在,那么集合 A 是集合 B 的子集 判断一个集合是否是另一个集合的子集

function isSubsetOf(setOne: any[], setTwo: any[]): boolean{
  if(!setOne.length){
    return true
  }
  if(setOne.length && !setTwo.length){
    return false
  }
  return setOne.every((item: any)=>{
    return setTwo.includes(item)
  })
}

计算多个数组的组合

应用场景:商品的 颜色、配置、形状的组合情况

function computeCombination(...args:any[]): any[]{
  if(args.length <= 1){
    return args
  }
  let tempResult: any[] = []

  const arrOne = args[0]
  const arrTwo = args[1]
  for(let i = 0; i < arrOne.length; i++){
    for(let j = 0; j < arrTwo.length; j++){
      tempResult.push(`${arrOne[i]} X ${arrTwo[j]}`)
    }
  }
  args.splice(0, 2, tempResult)
  return computeCombination(...args)
}