免责声明:我知道此问题的部分内容已经在此处被提及并回答过,是的,到目前为止,他们帮助我达到了这一点。
让我们说我有一个包含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]
。
谢谢!
答案 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;
}