10 javascript arrays
所以我有一个用可变长度数组填充的可变长度数组。例如这样的事情:
var arr2d = [
['red', 'blue'],
['cotton','polyester','silk'],
['large','medium','small']
]
Run Code Online (Sandbox Code Playgroud)
我试图从每个数组中获取一个的所有可能组合。所以答案应该是这样的:
var answer = [
['red', 'cotton', 'large'],
['red', 'cotton', 'medium'],
['red', 'cotton', 'small'],
['red', 'polyester', 'large'],
.
.
.
]
Run Code Online (Sandbox Code Playgroud)
我已经查看了有关此主题的其他答案,但所有答案都在 Java 中(我需要 javascript)并且他们正在寻找所有组合,而不仅限于length === arr2d.length. 我已经看了将近 2 个小时,但仍然想不出递归地执行此操作的方法。这是头部爆炸场景之一,因为两个数组的长度都不同(我有一个这些二维数组的数组,我必须获得组合)。在我列出的示例中,只有 18 种可能性,但实际上可能有数千种。
Mar*_*yer 15
使用递归函数时的另一个选择是在函数的参数中维护您的状态。这有时可以使函数更容易理解:
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))Run Code Online (Sandbox Code Playgroud)
这是一个递归解决方案。这个想法是获取第一个元素数组,在剩余元素数组上递归地查找组合,然后组合结果:
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));Run Code Online (Sandbox Code Playgroud)