我有这种类型的数据
var arr = [
["A", "AA"],
["B"],
["C", "CC", "CCC"]
];
我希望得到每个数组中所有元素的组合。例如。
A B
A B C
A B CC
A B CCC
A C
A CC
A CCC
...
AA B CCC
请注意,单词的顺序是相同的,因此不应该是B A C
组合之一。
我尝试了几种逻辑,但无法得到我想要的东西。我可以获得所有单词的所有排列和组合,但这不是我想要的。
请建议
答案 0 :(得分:2)
您基本上想要在多个列表中进行置换:
function permute(input)
{
var out = [];
(function permute_r(input, current) {
if (input.length === 0) {
out.push(current);
return;
}
var next = input.slice(1);
for (var i = 0, n = input[0].length; i != n; ++i) {
permute_r(next, current.concat([input[0][i]]));
}
}(input, []));
return out;
}
permute(arr);
答案 1 :(得分:1)
问题可以递归解决。也就是说:对于第一个数组,对于每个元素,您有与其他两个数组形成的组合的结果。
这样的事情可行:
function arrayCombine ( array ) {
if (array.length > 1) {
var result = new Array();
//This combines all the arrays except the first
var otherCombs = arrayCombine ( array.slice(1) );
for ( var n = 0; n < array[0].length; n++ )
for ( var i = 0; i < otherCombs.length; i++ )
result.push ( array[0][n] + otherCombs[i] );
return result;
}
//If we have only one array, the result is the array itself, for it contains in itself all the combinations of one element that can be made
else return array[0];
}
答案 2 :(得分:1)
idx
),每个元素对应于每一行。初始值0。idx[i]
。如果它小于行的长度,请转到2 idx[i]
设为零i
。如果它大于行数,则终止算法,否则转到2