如何在JavaScript中从动态矩阵生成笛卡尔积形式的列表?
嗨,你需要的其实是计算数组的笛卡尔积——也就是把多个数组的所有元素组合全部列出来,不管输入数组后续添加多少个子项,这两种方案都能完美适配:
方案一:递归实现
递归的思路是把问题拆解成更小的部分,每次处理一个子数组,再把它的元素和剩余数组的组合结果拼接起来:
function cartesianProduct(arr) { // 递归终止条件:如果输入数组为空,返回包含空数组的结果(作为组合的起点) if (arr.length === 0) { return [[]]; } // 取出第一个子数组,递归处理剩下的部分 const firstGroup = arr[0]; const remainingCombos = cartesianProduct(arr.slice(1)); // 将第一个数组的每个元素,和剩余数组的所有组合逐一拼接 return firstGroup.flatMap(item => { return remainingCombos.map(combo => [item, ...combo]); }); } // 测试你的输入 const input_array = [ ["black", "blue"], ["large", "medium"], ["a", "b", "c"] ]; const finallist = cartesianProduct(input_array); console.log(finallist);
这种写法代码简洁,逻辑清晰,很容易理解笛卡尔积的生成逻辑。
方案二:迭代实现
如果你担心递归可能有栈溢出风险(虽然一般输入数组不会长到那个程度),可以用迭代的方式逐步构建结果:
function cartesianProductIterative(arr) { // 初始结果是包含空数组的数组,作为组合的起点 let result = [[]]; // 遍历每一组可选值 for (const group of arr) { const temp = []; // 把现有结果的每个组合,和当前组的每个元素拼接 for (const existingCombo of result) { for (const item of group) { temp.push([...existingCombo, item]); } } // 更新结果为当前轮生成的所有新组合 result = temp; } return result; } // 测试你的输入 const input_array = [ ["black", "blue"], ["large", "medium"], ["a", "b", "c"] ]; const finallist = cartesianProductIterative(input_array); console.log(finallist);
迭代的方式从空组合开始,一步步把每组元素和现有组合结合,最终得到所有可能的结果。
两种方案都完全支持动态输入——不管你后续给input_array添加多少个子数组,它们都会自动生成对应的全组合。比如你再加入["x", "y"],结果里的每个现有组合都会分别和x、y拼接,生成更多的组合项。
内容的提问来源于stack exchange,提问作者Sarwar Hasan
相关产品推荐
相关产品推荐

