combine / combineArr
combine方法用于计算多长度数组的组合长度可能性,输入是各组长度的数组,返回索引组合的二维数组。combineArr方法用于多组数组的组合排列(笛卡尔积),输入是多组数组,返回所有可能的组合。
语法
javascript
combine(sizeArr)
combineArr(groupArr)描述
combine方法接收一个表示各组数组长度的数组,返回所有可能的索引组合。例如 combine([2, 3]) 返回 [[0,0], [0,1], [0,2], [1,0], [1,1], [1,2]],即 2×3 = 6 种索引组合。当只有一组时返回单元素索引数组。
combineArr方法接收多组数组,先通过 combine 计算各组长度对应的索引组合,再根据索引组合从原数组中取值,返回所有可能的元素组合(笛卡尔积)。结果中的每个元素都是原数组对应位置的值的克隆。
两个函数都依赖 ramda 的 clone 进行深拷贝,确保结果中的元素与原数组互不影响。
参数
combine
sizeArr number[]
各组数组的长度集合,如 [2, 3] 表示两组,第一组长度为 2,第二组长度为 3。
combineArr
groupArr array[]
多组数组的集合,如 [['a', 'b'], [1, 2, 3]] 表示两组数组。
返回值
combine
number[][] 返回索引组合的二维数组。每个子数组是一个索引组合,长度等于 sizeArr 的长度。
combineArr
array[] 返回所有可能的元素组合(笛卡尔积)。每个子数组是一个组合,长度等于 groupArr 的长度。元素为原数组值的克隆。
注意事项
combine输入的是长度数组(数字),输出的是索引组合;combineArr输入的是实际数组,输出的是元素组合- 结果总数等于各组长度(或各组元素数)的乘积,如
[2, 3, 2]会产生 12 种组合 combineArr使用 ramda 的clone对每个元素进行深拷贝,结果中的元素与原数组互不影响- 当输入为单组时,
combine返回单元素索引数组,如combine([3])返回[[0], [1], [2]] - 当输入为空数组时,行为未定义,建议至少传入一组
示例
combine 索引组合
combineArr 笛卡尔积
三组组合
浏览器兼容
combine 和 combineArr 函数在所有现代浏览器中均可使用,不依赖任何浏览器特定 API。
性能考虑
- 时间复杂度: O(n₁ × n₂ × ... × nₖ) - 结果数为各组长度(元素数)的乘积,其中 k 为组数
- 空间复杂度: O(n₁ × n₂ × ... × nₖ × k) - 需要存储所有组合结果
combine内部使用迭代方式逐步合并,避免递归栈溢出combineArr使用 ramda 的clone对每个元素进行深拷贝,在大数据量时可能有性能开销- 当组数或各组长度较大时,结果数量呈指数增长,需注意内存使用
相关函数
- deepConvert - 深度遍历对象并根据规则进行数据处理
- deepMerge - 深度合并两个对象