如何将嵌套数组分组/展平为所有子数组组合
解决嵌套数组的所有子数组组合生成问题
看起来你需要生成嵌套数组中所有子数组元素的笛卡尔积组合——也就是从每个层级的子数组里各选一个元素,组合出所有可能的扁平化数组。下面是具体的实现思路和代码:
核心思路
我们可以分成两步来完成需求:
- 递归收集所有子数组:遍历整个嵌套数组,把所有层级的子数组都提取出来,不管嵌套深度。
- 计算笛卡尔积:对收集到的所有子数组,计算它们的笛卡尔积,得到所有可能的元素组合。
完整代码实现
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
相关产品推荐
相关产品推荐

