从JS中的数组中查找所有组合序列

时间:2016-09-22 13:47:34

标签: javascript arrays loops recursion set

免责声明:我知道此问题的部分内容已经在此处被提及并回答过,是的,到目前为止,他们帮助我达到了这一点。

让我们说我有一个包含2个元素的数组,我想找到所有可能由这些元素组成的组合。集合的顺序无关紧要。

var myArr = ['a','b'];

期望的结果

var result = [ [a], [a,b], [b], [b,a] ]

起初我以为我正在寻找一套电源,但我不想要null设置,我想将[a,b][b,a]视为唯一序列,而不是等于。有关集合,空集和相等集here的更多信息。

到目前为止,我已经编写了这个函数,它将递归遍历我的数组,为每个可能的组合创建新数组并将它们推送到结果数组中。

function getCombinations() {

    var myArr = ['a','b'],
    result = [];

    var recurFn = function(prefix, myArr) {

        for (var i = 0; i < myArr.length; i++) {

            var newArray = prefix !== '' ? [prefix, myArr[i]] : [myArr[i]];
            result.push(newArray);
        recurFn(prefix + myArr[i], myArr.slice(i + 1));
        }
    }

    recurFn('', myArr);
    console.log(result); //[[a], [a,b], [b]]

}

以上是我的上述代码的fiddle

目前我只返回3种可能的组合[a], [a,b], [b],如何修改我的代码,以便我返回[a], [a,b], [b], [b,a]

谢谢!

2 个答案:

答案 0 :(得分:1)

你能以相反的顺序制作两个数组:

var myArr = ['a','b']
var myArr2 = ['b','a']

var recurFn = function(prefix, myArr) {

    for (var i = 0; i < myArr.length; i++) {

        var newArray = prefix !== '' ? [prefix, myArr[i]] : [myArr[i]];
        result.push(newArray);
    recurFn(prefix + myArr[i], myArr.slice(i + 1));
    }
    for (var i = 0; i < myArr2.length; i++) {

        var newArray2 = prefix !== '' ? [prefix, myArr2[i]] : [myArr2[i]];
        result.push(newArray2);
    recurFn(prefix + myArr2[i], myArr2.slice(i + 1));
    }
newArray.concat(newArray2);
newArray.unique();

}

答案 1 :(得分:1)

试试这个,适用于所有数组大小:

jsfiddle:https://jsfiddle.net/fcwa3cz5/2/

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

function allArrCombi(arr){
var hash={};
var res=[];
arr.sort();
var len=Math.pow(2, arr.length);
for (var i=1;i<len;i++){
    var lineRes=[];
    for (var innerPos=0;innerPos < arr.length;innerPos++){
        var mask = 1 << innerPos;

        if (mask & i){
            lineRes.push(arr[innerPos]);
        }
    }
    do{
        if (!hash[arr.join("-")]){ // did we have this combinatin already
            res.push(lineRes.slice())
        }
    }while(nextPermutation(lineRes))
}

    return res;
}


function nextPermutation(array) {

var i = array.length - 1;
while (i > 0 && array[i - 1] >= array[i])
    i--;
if (i <= 0)
    return false;


var j = array.length - 1;
while (array[j] <= array[i - 1])
    j--;
var temp = array[i - 1];
array[i - 1] = array[j];
array[j] = temp;


j = array.length - 1;
while (i < j) {
    temp = array[i];
    array[i] = array[j];
    array[j] = temp;
    i++;
    j--;
}
return true;

}