在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]]
任何帮助将非常感激。
这是使用递归辅助函数的一个非常简单而简短的代码:
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。
functioncartesian(arg)
arg
arguments