javascript-计算系列的所有组合

我有一个项目列表,每个项目都有一个数量.

var items = {
    1: 12,   // we have 12 x item1
    2: 1,    // we have 1 x item2
    3: 1,
    4: 7,
    5: 2,
    6: 2
};

或者,可以将其视为:

var items = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
             2, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 6, 6];

您将如何获取这些项目的每个组合的列表,请记住顺序完全不重要(因此[1,2,3] == [3,2,1]),而不是每个项目结果中必须存在.

我想输出看起来像这样:

[1]
[1, 1]
[1, 2]
[1, 3]
...

或者,甚至更好:

{1 : 1}          // 1 x item1
{1 : 2}          // 2 x item1 
{1 : 1, 2 : 1}   // 1 x item1, 1 x item2
{1 : 1, 3 : 1}
....

解决方法:

更新:发布此答案后,我注意到existing answer具有相同的方法,但由于它比较冗长,甚至具有有效的代码,我仍会继续留神:)

如果原始项目池中每个项目只有一个实例,并且您的项目代表二进制数字;

var items {
    1 : 1,
    2 : 1,
    4 : 1,
    8 : 1,
    16: 1,
    32: 1
};

该问题将简化为生成可以由这些数字表示的所有数字的序列:

> 0([]-无项目)
> 1([1])
> 2([2])
> 3([2,1])
> 4([4])
>等

因此,您的问题可以被视为简单地询问可以由-不是二进制-而是mixed-radix数字系统表示的数字序列.

这意味着,您可以为此怪异的编号系统编写一个计数器,以循环访问值0和MAX.因此,从累加最低有效数字开始,然后在用尽所有可能的数值后,继续使用最高有效数字.

var items = {
    1: 12,   // we have 12 x item1
    2: 1,    // we have 1 x item2
    3: 1,
    4: 7,
    5: 2,
    6: 2
};

var counter = {
    1: 0,
    2: 0,
    3: 0,
    4: 0,
    5: 0,
    6: 0
};

function increment(digit) {
    if (digit > 6) {
        return false;
    }

    var value = counter[digit] + 1;

    if (value > items[digit]) {
        counter[digit] = 0;
        return increment(digit + 1);
    }

    counter[digit] = value;

    return true;
}

while (increment(1)) {
    var set = [];

    for (var digit in counter) {
        var value = counter[digit];

        for (var i = 0; i < value; i++) {
            set.push(digit);
        }
    }

    document.write("<div>" + set + "</div>");
}

输出看起来像这样:

1
1,1
1,1,1

---- snip ----

2
1,2
1,1,2

---- big snip ----

1,1,1,1,1,1,1,1,2,3,4,4,4,4,4,4,4,5,5,6,6
1,1,1,1,1,1,1,1,1,2,3,4,4,4,4,4,4,4,5,5,6,6
1,1,1,1,1,1,1,1,1,1,2,3,4,4,4,4,4,4,4,5,5,6,6
1,1,1,1,1,1,1,1,1,1,1,2,3,4,4,4,4,4,4,4,5,5,6,6
1,1,1,1,1,1,1,1,1,1,1,1,2,3,4,4,4,4,4,4,4,5,5,6,6
上一篇:javascript-使1和0的所有组合.代码在Java中效果很好,但在js中效果不佳


下一篇:mysql-需要查询两个字段的不同组合,以及发生不同组合的计数