js数组的排列组合--从指定数组里提取任意项

878 阅读1分钟

在上次的项目里我遇到了一个需要用数组的排列组合才能解决的问题,于是百度了好久,但结果都差强人意,因为我们的需求是在一个任意长度的数组里提取任意项,然后组合成新的数组,然后百度的都是指定了几项的,由于时间来不及,只能先用百度的,待有时间在自己写,

刚开始百度的:

// 数组排列组合2
    chooseTwo(arr) {
      let brr = [];
      for (var i = 0, len1 = arr.length; i < len1; i++) {
        var a2 = arr.concat();
        a2.splice(0, i + 1);
        for (var j = 0, len2 = a2.length; j < len2; j++) {
          brr.push(arr[i] + "," + a2[j]);
        }
      }
      return brr;
    },
    // 数组排列组合3
    chooseThree(arr) {
      let brr = [];
      for (var i = 0, len1 = arr.length; i < len1; i++) {
        var a2 = arr.concat();
        a2.splice(0, i + 1);
        for (var j = 0, len2 = a2.length; j < len2; j++) {
          var a3 = a2.concat();
          a3.splice(0, j + 1);
          for (var k = 0, len3 = a3.length; k < len3; k++) {
            brr.push(arr[i] + "," + a2[j] + "," + a3[k]);
            // console.log(arr[i] + " " + a2[j] + " " + a3[k]);
          }
        }
      }
      return brr;
    },
    // 数组排列组合4
    chooseFour(arr) {
      let brr = [];
      for (var i = 0, len1 = arr.length; i < len1; i++) {
        var a2 = arr.concat();
        a2.splice(0, i + 1);
        for (var j = 0, len2 = a2.length; j < len2; j++) {
          var a3 = a2.concat();
          a3.splice(0, j + 1);
          for (var k = 0, len3 = a3.length; k < len3; k++) {
            var a4 = a3.concat();
            a4.splice(0, k + 1);
            for (var l = 0, len4 = a4.length; l < len4; l++) {
              brr.push(arr[i] + "," + a2[j] + "," + a3[k] + "," + a4[l]);
            }
          }
        }
      }
      return brr;
    },

只能自己手动加一层for循环,一层一层地嵌套,如果,存在很大的缺陷, 后面自己有空的时候又百度了蛮多,优化之后:

//数组排列组合,arr就是数组,num(从每一个数组取多少个)
sortArr (arr,num=3) {
let brr = []
for( let i = 0; i < arr.length; i++ ){
  if (i==0) {
    brr.push([arr[i]])
  }else{
    let addarr = []
    addarr.push([arr[i]])
    for( let j = 0; j < brr.length; j++ ){
      addarr.push([...brr[j],arr[i]])
    }
    brr = brr.concat(addarr)
  }
}
let res = brr.filter(item=>{
  return item.length == num
})
return res
}

大概就是这样子,感兴趣的小伙伴点个赞吧,哈哈哈