所以我有一个充满变长数组的变长数组。例如这样的事情:
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
的组合。我已经看了这个近两个小时了,但我仍然想不出一种方法来递归地执行此操作。这是头部爆炸场景之一,因为两个数组的长度都不同(我有一个由这些二维数组组成的数组,我必须获得它们的组合)。在我列出的示例中,只有 18 种可能性,但实际上可能有数千种。
有时使函数更容易理解:
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))
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));
推荐的解决方案看起来会崩溃(调用堆栈)或永远挂起(没有中断的循环)给定不平凡的数据集。
而且就像两行代码:)
import {CartesianProduct} from './combinatorics.js';
console.log([...CartesianProduct.from(arr2d)]);