我想做的事情可能比我想象的要复杂。问题的前提如下:
鉴于:
let params = [[1,2,3], ["A","B","C"], [10,11,12]]
和let pairRestrictions: {0:{2:{1:["A","B"]}}}
个
其中第一个:
- key 0:参数的索引
- 键2:第一个参数的值
- 键1:第二参数的索引
["A","B"]
:第二个参数可以得到的可能值。
我想写一个计算params
的笛卡尔积的算法。关于所给的条件。
因此,假设创建这些组合的函数被调用:
generateCombinations(params, pairRestrictions)
字符串
此函数应返回:
let result = [
[1, 'A', 10], [1, 'A', 11], [1, 'A', 12],
[1, 'B', 10], [1, 'B', 11], [1, 'B', 12],
[1, 'C', 10], [1, 'C', 11], [1, 'C', 12],
[2, 'A', 10], [2, 'A', 11], [2, 'A', 12],
[2, 'B', 10], [2, 'B', 11], [2, 'B', 12],
[3, 'A', 10], [3, 'A', 11], [3, 'A', 12],
[3, 'B', 10], [3, 'B', 11], [3, 'B', 12],
[3, 'C', 10], [3, 'C', 11], [3, 'C', 12]
]
型
提前感谢!
我可以创建笛卡尔积的代码段,但我不能设法有条件的一部分。
这是我目前使用的解决方案:
function recur(combinations = [], i) {
let res = [];
if (i === params.length) {
return combinations;
}
for (let p in params[i]) {
let combinationsCopy = [];
for (let c in combinations) {
combinationsCopy.push(combinations[c].concat(params[i][p]));
}
res = res.concat(combinationsCopy);
}
return recur(res, i + 1);
}
recur(
params[0].map((x) => [x]),
1
);
型
2条答案
按热度按时间brqmpdu11#
更新:切换到更高效的
cartesian
实现。我们可以将您的限制转换为 predicate 函数数组,然后过滤在输入上调用
cartesian
函数的结果,以仅包含与所有这些 predicate 匹配的值。个字符
我假设你的限制是累积的。如果你想包含所有符合 any 限制的值,那么你可以用
.some
替换函数最后一行的.every
。因此,对于这样的pair限制对象:
型
我们将得到以下三个函数的等价物:
型
如果我们更喜欢一个更短但不太明确的等价物,比如:
型
我们可以将函数中的关键行替换为:
型
请注意,整个限制配置技术有一个明显的局限性:我们测试的值,除了在最深的数组中,不能有任意类型:它们必须作为对象键工作。这意味着,字符串,数字,还有,我猜,符号。任何其他类型都会失败。
8oomwypt2#
可能不是对象
条件逻辑和布尔表达式可以表示复杂的思想,这些思想很难用基于对象的编码完全捕获。
如果col 0是2,那么col 1必须是“A”或“B”:
字符串
在JavaScript中捕获条件逻辑的自然方法是一个函数-
型
使用简单的
product
生成器-型
让我们对产品进行筛选,看看结果--
型
逻辑蕴涵
上面我们用否定来过滤掉,但也许你想得更多 “如果x =..然后如果y =..",即logical implication,即x
implies
y -我们可以看到被测物体的极限-
如果col 0是2,则col 1必须是“A”或“B”,并且
如果col 0为3,则col 2必须为11或12,并且
如果col 1是“C”,则col 0必须是1或2:
型
相比之下,蕴涵帮助我们编写正过滤器,我们的表达式可以很容易地组合起来表示更复杂的逻辑-
型
自由思考
或者如果你用否定的方式思考,你可以这样写,达到同样的效果-
灵活性
能力组成(分解隐含!)过滤器允许增加灵活性,并且当顺序可能很重要时可以排序-
生成器
即使您看到多个
for
循环,生成器也是惰性运行的,因此每个产生的值都是临时处理的。这使得它们成为组合数学或其他大型数据集的良好选择,在这些数据集中,当元素变得可用时,调用者可以立即访问它们。相比之下,数组是有限的,必须在调用方获得对任何元素的访问权之前进行完整计算。还有一个优化的
product
函数,我们一直在使用!详情请参见this Q&A。