如何拆分数组中的子数组并生成唯一组合?
解决嵌套数组的笛卡尔积展开问题
嘿,这个问题本质上是要生成嵌套数组元素的笛卡尔积——也就是把每个子数组里的元素和其他子数组的元素做所有可能的组合,再和非数组的固定元素拼接起来。我给你一步步讲清楚怎么实现:
核心思路
- 先把原数组拆成两部分:
- 固定部分:所有非数组类型的元素(比如示例里的
['a','b','c','d']) - 待组合部分:所有嵌套的子数组(比如示例里的
[['l','o','p'], [1,4]])
- 固定部分:所有非数组类型的元素(比如示例里的
- 计算待组合部分的笛卡尔积,得到所有可能的元素组合
- 把固定部分和每个组合拼接,就得到你要的结果
代码实现
首先实现一个通用的笛卡尔积函数,用来处理多个子数组的组合:
function cartesianProduct(arrays) { // 用reduce和flatMap迭代生成所有组合 return arrays.reduce((accumulator, currentArray) => { return accumulator.flatMap(prevItem => { return currentArray.map(currentItem => [...prevItem, currentItem]); }); }, [[]]); // 初始值设为包含空数组的数组,用来启动组合逻辑 }
然后写处理原数组的主函数:
function expandNestedArrays(originalArray) { // 拆分固定元素和嵌套子数组 const fixedElements = originalArray.filter(item => !Array.isArray(item)); const nestedArrays = originalArray.filter(item => Array.isArray(item)); // 如果没有嵌套数组,直接返回包含原数组的数组 if (nestedArrays.length === 0) { return [fixedElements]; } // 计算子数组的笛卡尔积 const productCombinations = cartesianProduct(nestedArrays); // 把固定元素和每个组合拼接 return productCombinations.map(combination => [...fixedElements, ...combination]); }
测试示例
示例1:单个嵌套数组
const arr1 = ['a','b','c','d',['l','o','p']]; console.log(expandNestedArrays(arr1)); // 输出结果: // [['a','b','c','d','l'], ['a','b','c','d','o'], ['a','b','c','d','p']]
示例2:多个嵌套数组
const arr2 = ['a','b','c','d',['l','o','p'],[1,4]]; console.log(expandNestedArrays(arr2)); // 输出结果: // [ // ['a','b','c','d','l',1], // ['a','b','c','d','o',1], // ['a','b','c','d','p',1], // ['a','b','c','d','l',4], // ['a','b','c','d','o',4], // ['a','b','c','d','p',4] // ]
额外说明
如果你的嵌套数组还有更深层次的嵌套(比如['a', ['b', ['c', 'd']]]),可以先加一个递归扁平化的函数,把所有深层子数组都提取到第一层,再用上面的代码处理。比如:
function flattenNestedArrays(arr) { const result = []; arr.forEach(item => { if (Array.isArray(item)) { result.push(...flattenNestedArrays(item)); } else { result.push(item); } }); return result; }
不过根据你给出的例子,当前的代码已经完全能满足需求啦~
内容的提问来源于stack exchange,提问作者Afsar
相关产品推荐
相关产品推荐

