如何获取数组中所有可能的元素组合,包括顺序和长度。

3

function getAllCombinations(arr) {

  var f = function(arr) {
    var result = [];
    var temp = [];

    for (var i = 0; i < arr.length; i++) {
      temp = [];
      temp.push(arr[i]);
      result.push(temp);

      for (var j = 0; j < arr.length; j++) {
        if (j != i) {
          temp = [];
          temp.push(arr[i]);
          temp.push(arr[j]);
          result.push(temp);

          for (var k = 0; k < arr.length; k++) {
            if (k != i && k != j) {
              temp = [];
              temp.push(arr[i]);
              temp.push(arr[j]);
              temp.push(arr[k]);
              result.push(temp);

              for (var l = 0; l < arr.length; l++) {
                if (l != i && l != j && l != k) {
                  temp = [];
                  temp.push(arr[i]);
                  temp.push(arr[j]);
                  temp.push(arr[k]);
                  temp.push(arr[l]);
                  result.push(temp);
                }
              }
            }
          }
        }
      }
    }

    return result;
  }
  return f(arr);
}

//call this function
console.log(getAllCombinations(["a", "b", "c", "d"]));

[["a"],["a","b"],["a","b","c"],["a","b","c","d"],["a","b","d"],["a","b","d","c"],["a","c"],["a","c","b"],["a","c","b","d"],["a","c","d"],["a","c","d","b"],["a","d"],["a","d","b"],["a","d","b","c"],["a","d","c"],["a","d","c","b"],["b"],["b","a"],["b","a","c"],["b","a","c","d"],["b","a","d"],["b","a","d","c"],["b","c"],["b","c","a"],["b","c","a","d"],["b","c","d"],["b","c","d","a"],["b","d"],["b","d","a"],["b","d","a","c"],["b","d","c"],["b","d","c","a"],["c"],["c","a"],["c","a","b"],["c","a","b","d"],["c","a","d"],["c","a","d","b"],["c","b"],["c","b","a"],["c","b","a","d"],["c","b","d"],["c","b","d","a"],["c","d"],["c","d","a"],["c","d","a","b"],["c","d","b"],["c","d","b","a"],["d"],["d","a"],["d","a","b"],["d","a","b","c"],["d","a","c"],["d","a","c","b"],["d","b"],["d","b","a"],["d","b","a","c"],["d","b","c"],["d","b","c","a"],["d","c"],["d","c","a"],["d","c","a","b"],["d","c","b"],["d","c","b","a"]]

一个4长度的数组有64种组合。

这个函数可以正常工作,但我需要将其改造成递归函数。for循环必须基于数组的长度进行嵌套,并且每个嵌套循环中的push也要相应增加。

非常感谢您提供一些建议。


1
可能是JavaScript中多个数组的笛卡尔积的重复问题。 - Christopher Moore
嗨@ChristopherMoore,我得到了一个长度为4的数组的总共64个组合。如上所示,我的代码中嵌套的for循环数量为4,并且每个循环中push的数量增加。这是我希望用递归函数自动化的模式。嵌套的for循环数量=数据数组的长度 每个嵌套循环中添加的条件更改=1 每个嵌套循环中增加的push数量=1 - Jeetu
这是一个有趣的问题,但不幸的是它并不简单。我上面提到的问题可能不能解决这个确切的问题,但答案肯定会帮助指导你找出递归解决方案。 - Christopher Moore
3个回答

3

终于做到了递归!尝试将每个循环功能移入简单函数,以便更好地处理上面发布的原始代码。

function getAllCombinations(inputArray) {
  var resultArray = [];
  var combine = function() {
    for (var i in inputArray) {
      var temp = [];
      var tempResult = [];
      for (var j in arguments) {
        tempResult.push(inputArray[arguments[j]]);
        if (arguments[j] == i) {
          temp = false;
        } else if (temp) {
          temp.push(arguments[j]);
        }
      }
      if (temp) {
        temp.push(i);
        combine.apply(null, temp);
      }
    }
    if (tempResult.length > 0) {
      resultArray.push(tempResult);
    }
    return resultArray;
  };
  return combine();
}

查看旧版本请点击这里

该结果为一个4维数组生成了64个独特的组合

console.log(getAllCombinations(["a", "b", "c", "d"]));

[["a","b","c","d"],["a","b","c"],["a","b","d","c"],["a","b","d"],["a","b"],["a","c","b","d"],["a","c","b"],["a","c","d","b"],["a","c","d"],["a","c"],["a","d","b","c"],["a","d","b"],["a","d","c","b"],["a","d","c"],["a","d"],["a"],["b","a","c","d"],["b","a","c"],["b","a","d","c"],["b","a","d"],["b","a"],["b","c","a","d"],["b","c","a"],["b","c","d","a"],["b","c","d"],["b","c"],["b","d","a","c"],["b","d","a"],["b","d","c","a"],["b","d","c"],["b","d"],["b"],["c","a","b","d"],["c","a","b"],["c","a","d","b"],["c","a","d"],["c","a"],["c","b","a","d"],["c","b","a"],["c","b","d","a"],["c","b","d"],["c","b"],["c","d","a","b"],["c","d","a"],["c","d","b","a"],["c","d","b"],["c","d"],["c"],["d","a","b","c"],["d","a","b"],["d","a","c","b"],["d","a","c"],["d","a"],["d","b","a","c"],["d","b","a"],["d","b","c","a"],["d","b","c"],["d","b"],["d","c","a","b"],["d","c","a"],["d","c","b","a"],["d","c","b"],["d","c"],["d"]]


0

这是我的解决方案,使用了子程序闭包。此外,切片在这里非常有用。

如果您觉得这对您有帮助,或者认为其他人会发现这有用,请不要害怕点赞。

function getMyCombinations(coll) {
  const result = [];
  
  (function search(currentPerm, letters) { 
    if (letters.length === 0) return result.push(currentPerm);
    let trimArray = letters.slice(1);
    letters.forEach(letter => search(currentPerm + letter, trimArray));
  })('', coll)

  return result;  
}


console.log(getMyCombinations(["a", "b", "c", "d"]));

I have refactored my original answer to better align with the users request.

function findPerm(array, currentPerm = '', result =[]) {
  if (array.length === 0) return result;
  let trimArray = array.slice(1);
  array.forEach(v => {
    let copy = [...result];
    let perm = (currentPerm + v).split('');
    let res = copy.push(perm);
    result = findPerm(trimArray, currentPerm + v, copy);
  });
  return result;
};

console.log(findPerm(['a', 'b', 'c', 'd']));


这似乎没有产生@Jeetu想要的数组。 - Christopher Moore
嗨@ChristopherMoore,我得到了一个长度为4的数组的总共64个组合。如上所示,我的代码中嵌套的for循环数量为4,并且每个循环中push的数量都增加了。这是我希望用递归函数自动化的模式。嵌套的for循环数量=数据数组的长度 每个嵌套循环中添加的条件更改=1 每个嵌套循环中增加的push数量=1 - Jeetu
嗨@MattFernandez,结果产生了64个元素。存在项目重复(["d","d","d"],["d","d","d","d"] ...) 我只需要唯一的项目(任何顺序/任何长度)。我上面发布的代码每个组合仅生成唯一项。 - Jeetu
这非常有趣。请原谅我。 - Matt Fernandez

0

另一种解决方案,似乎可以得到所需的输出 :)

console.log(JSON.stringify(getMyCombinations(["a", "b", "c", "d"])))

function getMyCombinations(arry) {
    var len = arry.length;
    var tempArray = [];
    var result = []
    var tempCount = 1;

    var createCombinations = function(count){
        var singleLevelArray = [];

        arry.forEach(function(item){

            if(count){//1
                if(count > 1){
                    for(var j = 0; j < tempArray.length; j++){
                        if(tempArray[j].indexOf(item) === -1){
                            var x = tempArray[j].slice();
                            x.push(item);
                            singleLevelArray.push(x);
                            result.push(x);
                        }
                    } 
                } else {
                    for(var k = 0; k < len; k++){
                        if(item.indexOf(arry[k]) === -1){
                            tempArray.push([item, arry[k]]);
                            result.push([item, arry[k]]);
                        }
                    }
                }

            } else {
                result.push([item]);
            }

        })
        if(singleLevelArray.length){
            tempArray = []
            tempArray = singleLevelArray;
        }
        if(tempCount < len){
            createCombinations(tempCount++);
        }

        return result;

    }
    return createCombinations()
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接