如何在JavaScript中用递归动态组合数组的数组
实现任意长度数组的笛卡尔积组合(JavaScript)
要实现任意长度的数组的数组的笛卡尔积组合,替代硬编码的嵌套for循环,递归是最直观的方案。以下是完整实现:
递归实现方案
function getCombinations(arrays) { const result = []; // 递归辅助函数:处理指定索引的子数组,维护当前组合路径 function generate(index, path) { // 递归终止:所有子数组处理完成,保存当前组合 if (index === arrays.length) { result.push([...path]); return; } // 遍历当前子数组的每个元素,递归构建组合 for (const item of arrays[index]) { path.push(item); generate(index + 1, path); path.pop(); // 回溯,重置路径以处理下一个元素 } } // 启动递归:从第0个子数组开始,初始路径为空 generate(0, []); return result; }
工作原理
generate函数负责递归构建组合:index标记当前处理的子数组位置,path记录当前已选择的元素序列。- 当
index等于输入数组的长度时,说明已完成一组完整组合,将path的副本存入结果(使用[...path]避免后续修改影响已保存的组合)。 - 遍历当前子数组的每个元素,将其加入
path后递归处理下一个子数组;递归返回后通过path.pop()回溯,确保路径能正确切换到当前子数组的下一个元素。
使用示例
// 示例输入 const levels = [ [{ level: 1, value: "a" }, { level: 1, value: "b" }], [{ level: 2, value: "c" }, { level: 2, value: "d" }], [{ level: 3, value: "e" }, { level: 3, value: "f" }] ]; // 获取所有组合 const combinations = getCombinations(levels); console.log(combinations);
运行后会输出你预期的全组合结果,且支持任意长度的输入数组。
可选:非递归的Reduce实现
如果偏好更简洁的写法,也可以用数组的reduce和flatMap方法实现非递归版本:
function getCombinations(arrays) { return arrays.reduce((acc, curr) => { return acc.flatMap(prevComb => curr.map(item => [...prevComb, item])); }, [[]]); }
该版本以[[]]为初始值,每次将现有组合与当前子数组的元素逐一拼接,最终生成所有笛卡尔积组合。
内容的提问来源于stack exchange,提问作者opendev
相关产品推荐
相关产品推荐

