如何将动态长度多维数组转换为拼接后的类矩阵多维数组
实现方案
你要实现的是多个数组的笛卡尔积计算,动态长度的外层数组和子数组都可以兼容,以下是可直接运行的JavaScript实现:
function cartesianProduct(arrays) { return arrays.reduce((acc, curr) => { const res = [] acc.forEach(aItem => { curr.forEach(cItem => { res.push([...aItem, cItem]) }) }) return res }, [[]]) }
注意:如果输入的数组中包含空的子数组,最终返回结果会是空数组,符合笛卡尔积的标准运算规则。
调用测试
用你给出的两个示例测试均可得到正确结果:
测试示例1
const a = [ ['red', 'blue'], ['small', 'medium', 'large'], ] console.log(cartesianProduct(a)) // 输出和你给出的b完全一致
测试示例2
const a = [ ['quadcore'], ['4GB', '8GB'], ['black', 'grey'], ] console.log(cartesianProduct(a)) // 输出和你给出的b完全一致
实现逻辑说明
- 用reduce迭代外层的所有子数组,初始累计值设为
[[]],保证首次迭代可以正确和第一个子数组的元素拼接 - 每轮迭代时,把已有的所有组合和当前子数组的每个元素逐一拼接,生成新的组合列表
- 迭代完全部子数组后得到的就是所有元素的全排列组合,也就是你要的类矩阵多维数组
内容的提问来源于stack exchange,提问作者Chwizdo
相关产品推荐
相关产品推荐

