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

如何将嵌套数组分组/展平为所有子数组组合

解决嵌套数组的所有子数组组合生成问题

看起来你需要生成嵌套数组中所有子数组元素的笛卡尔积组合——也就是从每个层级的子数组里各选一个元素,组合出所有可能的扁平化数组。下面是具体的实现思路和代码:

核心思路

我们可以分成两步来完成需求:

  1. 递归收集所有子数组:遍历整个嵌套数组,把所有层级的子数组都提取出来,不管嵌套深度。
  2. 计算笛卡尔积:对收集到的所有子数组,计算它们的笛卡尔积,得到所有可能的元素组合。

完整代码实现

function group(arr) {
  // 第一步:递归收集所有层级的子数组
  const getAllSubarrays = (current) => {
    let subarrays = [];
    if (Array.isArray(current)) {
      // 先把当前数组加入收集列表
      subarrays.push(current);
      // 递归处理每个元素,收集更深层级的子数组
      current.forEach(item => {
        subarrays = subarrays.concat(getAllSubarrays(item));
      });
    }
    return subarrays;
  };

  // 第二步:计算多个数组的笛卡尔积
  const cartesianProduct = (arrays) => {
    return arrays.reduce((result, currentArray) => {
      // 将现有组合与当前数组的每个元素拼接,生成新的组合
      return result.flatMap(prevCombination => 
        currentArray.map(item => prevCombination.concat(item))
      );
    }, [[]]); // 初始值为空数组的数组,用于拼接第一个数组的元素
  };

  const subarrays = getAllSubarrays(arr);
  return cartesianProduct(subarrays);
}

// 测试你的输入数据
var arr = [ 1, [ 2, 3, 4, [ 5, 6, 7, 8, [ 9, 10 ], [ 11, 12 ] ], [ 13, 14 ] ] ];
var output = group(arr);
console.log(output);

代码细节解释

  • getAllSubarrays 函数会递归遍历输入数组,把所有层级的子数组都收集起来。比如你的输入数组,最终会收集到这些子数组:
    [
      [1, [2,3,4,...]],
      [2,3,4,[5,...],[13,14]],
      [5,6,7,8,[9,10],[11,12]],
      [9,10],
      [11,12],
      [13,14]
    ]
    
  • cartesianProduct 函数通过reduce和flatMap实现笛卡尔积计算:初始时是一个包含空数组的数组[[]],然后依次把每个子数组的元素和现有组合拼接,最终得到所有可能的元素组合。

输出示例

运行代码后,你会得到和你示例相似的结果,比如:

[
  [1, 2, 5, 9, 11, 13],
  [1, 2, 5, 9, 11, 14],
  [1, 2, 5, 9, 12, 13],
  // ... 所有其他可能的组合
]

如果结果顺序和你预期有差异,你可以调整子数组的收集顺序,或者在生成组合后进行排序。

内容的提问来源于stack exchange,提问作者Lance Pollard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 06:49:50