在javascript数组中查找字符串的所有组合

时间:2018-03-09 23:19:42

标签: arrays generator combinations

如何循环遍历字符串值数组并输出N个字符串值的所有组合?

我还需要保留每个组合,以便我可以遍历这些组合以在数据库中创建记录。

我发现combination generator有助于降低最低要求,我按如下方式对其进行了修改:

var combine = function(a, min) {
var fn = function(n, src, got, all) {
    if (n == 0) {
        if (got.length > 0) {
            all[all.length] = got;
        }
        return;
    }
    for (var j = 0; j < src.length; j++) {
        fn(n - 1, src.slice(j + 1), got.concat([src[j]]), all);
    }
    return;
}
var all = [];
for (var i = min; i < a.length; i++) {
    fn(i, a, [], all);
}
all.push(a);
return all;
}

var subsets = combine(["RT","PT","DDA"], 1);

输出:

RT,PT,DDA,RT,PT,RT,DDA,PT,DDA,RT,PT,DDA

技术上具有所有正确的输出,但我需要将它们分解为独特的组合,以便输出如下:

[[RT],[PT],[DDA],[RT,PT],[RT,DDA],[PT,DDA],[RT,PT,DDA]]

拥有一个数组数组将允许我稍后使用索引循环以在数据库中创建唯一记录。这至少是我的想法,我可以真正使用一些帮助,因为我仍然试图完全理解递归函数。

1 个答案:

答案 0 :(得分:0)

请注意,N个项目的每个组合(包括空组合)对应于范围0..2^N-1中的二进制数K.如果K在第i个位置包含1位,则第i个项目包括在第K个组合中。例如,值k=5=101binary对应于第0项和第2项的组合(在您的情况下为[RT,DDA])。

所以只需为K=1..2^N-1制作循环,检查K的位并构建相应的组合。伪代码:

for (k = 1; k < (1 << N); k++):
    comb = []
    t = k
    idx = 0
    while t > 0:
        if (t and 1):
           comb = comb + A[idx]               
        t = t << 1
        idx++