求支持N维数组的JavaScript多维数组元素排列生成方案
实现N维数组的笛卡尔积(元素排列生成)
嘿,你要的这个功能其实就是计算多维数组的笛卡尔积嘛!简单说就是从每一个子数组里各取一个元素,生成所有可能的组合,刚好完全规避了你提到的那种从同一个子数组里取多个元素的情况,而且天然支持任意N维的输入数组。
我给你两种实现思路,递归和迭代的都有,你可以根据自己的喜好选:
递归实现(简洁优雅,适合理解逻辑)
递归的核心思路是把问题拆解:先算出后面N-1个数组的笛卡尔积,再把第一个数组的每个元素和这些组合一一拼接起来。
function cartesianProduct(arrays) { // 递归终止条件:空数组输入时返回基础的空组合 if (arrays.length === 0) { return [[]]; } // 取出第一个子数组,递归处理剩余部分 const firstArr = arrays[0]; const restProducts = cartesianProduct(arrays.slice(1)); // 用flatMap扁平化结果,避免嵌套数组 return firstArr.flatMap(item => restProducts.map(product => [item, ...product]) ); }
测试一下你的示例:
const input = [ ['a', 'b', 'c', 'd'], ['e', 'f', 'g'], ['h', 'i'] ]; const result = cartesianProduct(input); console.log(result); // 输出就是你要的所有组合:['a','e','h'], ['a','e','i'], ['a','f','h'], ... 直到 ['d','g','i']
迭代实现(无递归,适合处理超大数组场景)
如果担心递归深度问题(比如输入数组维度特别多),可以用迭代的方式,从空组合开始逐步构建结果:
function cartesianProductIterative(arrays) { let result = [[]]; // 初始化结果为包含空数组的数组 for (const currentArr of arrays) { const temp = []; // 把现有结果里的每个组合,和当前子数组的每个元素拼接 for (const existingProduct of result) { for (const item of currentArr) { temp.push([...existingProduct, item]); } } result = temp; } return result; }
这两种方法都完美支持任意维度的输入数组,不管你是2维、5维还是更多,都能正确生成所有符合要求的元素组合,完全不会出现你不想看到的那种同子数组多元素的情况。
内容的提问来源于stack exchange,提问作者Marco Afonso
相关产品推荐
相关产品推荐

