所以我有一个可变长度数组,里面充满了可变长度数组。例如:
var arr2d = [
['red', 'blue'],
['cotton','polyester','silk'],
['large','medium','small']
]
我正在尝试从每个阵列中获得一个的所有可能组合。因此答案应如下所示:
var answer = [
['red', 'cotton', 'large'],
['red', 'cotton', 'medium'],
['red', 'cotton', 'small'],
['red', 'polyester', 'large'],
.
.
.
]
我已经研究了有关该主题的其他答案,但所有答案都在java中(我需要JavaScript),他们正在寻找所有组合,而不仅限于length === arr2d.length
的组合。我已经研究了将近2个小时,但仍然想不出一种递归的方法。这是那些爆炸的场景之一,因为这两个数组的长度都不同(我有这些2d数组的数组,我必须获得这些数组的组合)。在我列出的示例中,只有18种可能性,但实际上可能有成千上万种。
答案 0 :(得分:2)
使用递归函数时的另一种选择是在函数的参数中保持状态。 有时可以使该功能更易于理解:
var arr2d = [['red', 'blue'],['cotton','polyester','silk'],['large','medium','small']]
function combos(list, n = 0, result = [], current = []){
if (n === list.length) result.push(current)
else list[n].forEach(item => combos(list, n+1, result, [...current, item]))
return result
}
console.log(combos(arr2d))
答案 1 :(得分:1)
这是一个递归解决方案。想法是采用第一个元素数组,在其余元素数组上递归找到组合,然后组合结果:
const arr2d = [
['red', 'blue'],
['cotton', 'polyester', 'silk'],
['large', 'medium', 'small']
];
function combinations(arr) {
if (arr.length === 0) return [[]];
let res = [], [first, ...rest] = arr;
let remaining = combinations(rest);
first.forEach(e => {
remaining.forEach(smaller => {
res.push([e].concat(smaller));
});
});
return res;
}
console.log(combinations(arr2d));