You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求支持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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:08:40