一尘不染

JavaScript-从具有m个元素的n个数组生成组合

javascript

在JavaScript中,我想不出代码来从n个数组(其中m个元素)中生成组合的代码。对于其他语言,我也曾见过类似的问题,但答案包含了我不确定如何翻译的语法或库魔术。

考虑以下数据:

[[0,1], [0,1,2,3], [0,1,2]]

3个数组,其中包含不同数量的元素。我想做的是通过组合每个数组中的一项来获得所有组合。

例如:

0,0,0 // item 0 from array 0, item 0 from array 1, item 0 from array 2
0,0,1
0,0,2
0,1,0
0,1,1
0,1,2
0,2,0
0,2,1
0,2,2

等等。

如果数组的数目是固定的,则很容易进行硬编码实现。但是数组的数量可能会有所不同:

[[0,1], [0,1]]
[[0,1,3,4], [0,1], [0], [0,1]]

任何帮助将非常感激。


阅读 604

收藏
2020-04-25

共1个答案

一尘不染

这是使用递归辅助函数的一个非常简单而简短的代码:

function cartesian() {
    var r = [], arg = arguments, max = arg.length-1;
    function helper(arr, i) {
        for (var j=0, l=arg[i].length; j<l; j++) {
            var a = arr.slice(0); // clone arr
            a.push(arg[i][j]);
            if (i==max)
                r.push(a);
            else
                helper(a, i+1);
        }
    }
    helper([], 0);
    return r;
}

用法:

cartesian([0,1], [0,1,2,3], [0,1,2]);

要使函数采用数组数组,只需将签名更改为,functioncartesian(arg)从而将arg其作为参数而不是allarguments

2020-04-25