请教一道算法题?
有以下数据:
const labels = [
["红色", "黄色", "蓝色"],
["8g", "12g", "16g", "24g"],
["小米10", "小米11", "小米12", "小米13"],
["pro", "plus"],
// 后续N个参数列表
...
];
要求是,将所有项按顺序一一组合,如 红色8g小米10pro,红色8g小米10plus,红色8g小米11pro,红色8g小米11plus,...
以下是我的暴力解法
const combination = labels.reduce((result, item) => {
if (!result.length) {
result = [...item];
} else {
result = connect(result, item);
}
return result;
}, []);
function connect(s1, s2) {
const c = [];
s1.forEach(_s1 => {
s2.forEach(_s2 => {
c.push(_s1 + _s2);
});
});
return c;
};
再者,不按顺序又该如何解
回复
1个回答

test
2024-07-04
你解法已经很好了,对于不按顺序组合的问题,你可以用递归的方法来实现:
function cartesianProduct(labels, index = 0, current = '') {
if (index === labels.length) {
return [current];
}
let result = [];
for (const item of labels[index]) {
result = result.concat(cartesianProduct(labels, index + 1, current + item));
}
return result;
}
const labels = [
["红色", "黄色", "蓝色"],
["8g", "12g", "16g", "24g"],
["小米10", "小米11", "小米12", "小米13"],
["pro", "plus"],
// 后续N个参数列表
...
];
const combinations = cartesianProduct(labels);
console.log(combinations);
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容