如何生成嵌套数组的全组合?从每个内层数组取一个元素
生成多数组的全元素组合(每组从内层数组选一个元素)
问题分析
你需要生成的是多个数组的笛卡尔积:从每个内层数组中选取一个元素,组合出所有可能的结果。你的嵌套循环代码出错的核心原因是错误限制了循环起始索引(比如j = i + 1),每个数组的元素选择应该是完全独立的,不需要依赖前一个数组的索引值。
正确实现方法
1. 固定数组数量的嵌套循环(适合已知4个数组的场景)
直接让每个循环从0开始遍历对应数组的所有元素,取消索引关联:
let data = [ ['9', '8'], ['7', '10'], ['Q', 'K'], ['7', 'K'] ]; let combinations = []; for (let i = 0; i < data[0].length; i++) { for (let j = 0; j < data[1].length; j++) { for (let k = 0; k < data[2].length; k++) { for (let l = 0; l < data[3].length; l++) { combinations.push([data[0][i], data[1][j], data[2][k], data[3][l]]); } } } } console.log(combinations);
这段代码会生成所有2*2*2*2=16种符合要求的组合。
2. 通用递归方法(适配任意数量的内层数组)
如果后续可能调整内层数组的数量,用迭代方式动态生成组合更灵活:
function generateCombinations(arrays) { let result = [[]]; for (let currentArr of arrays) { const tempCombos = []; // 遍历已有的所有组合,和当前数组的每个元素拼接 for (let existingCombo of result) { for (let item of currentArr) { tempCombos.push([...existingCombo, item]); } } result = tempCombos; } return result; } let data = [ ['9', '8'], ['7', '10'], ['Q', 'K'], ['7', 'K'] ]; console.log(generateCombinations(data));
3. Lodash 正确实现方式
你之前用Lodash效果不佳是因为没用到适配的方法,Lodash的_.product方法专门用于生成笛卡尔积:
const _ = require('lodash'); let data = [ ['9', '8'], ['7', '10'], ['Q', 'K'], ['7', 'K'] ]; let combinations = _.product(...data); console.log(combinations);
_.product接受任意数量的数组参数,直接返回所有元素组合的数组,完全匹配你的需求。
内容的提问来源于stack exchange,提问作者Matan Malka
相关产品推荐
相关产品推荐

