【问题标题】:Check if array contained within another in rego检查数组是否包含在 rego 中的另一个中
【发布时间】:2021-10-26 08:21:23
【问题描述】:
我有两个数组:x 和 y
我想检查x 是否包含在y 中。
rego 中没有 contains() 函数。
接下来我尝试创建与 contains() 函数等效的数学函数:
x ⊆ y ⇔ (x ⋂ y) == x.
所以我尝试执行以下操作:
z := x & y
x == z
但这会产生以下错误:
rego_type_error: and: 无效参数
有: (array[any], any, ???)
想要: (set[any], set[any], set[any])
那我该怎么做呢?
【问题讨论】:
标签:
arrays
set
contains
open-policy-agent
rego
【解决方案1】:
Set operations 仅适用于.. 好吧,设置 :) 如果您创建 x 和 y 作为新设置(只需使用 {...} 而不是 [...])您的示例应该可以工作。如果 x 和 y 是数组 - 就像引用来自 input 的值时经常出现的情况一样 - 您可以使用集合推导来转换它们,例如:
xs := {e | e := x[_]}
ys := {e | e := y[_]}
然后使用xs 和ys 作为集合。另一方面,如果你真的想使用数组(比如在排序和重复值很重要的时候),你可以这样做:
contained {
y[i]
x == array.slice(y, i, i + count(x))
}
这将遍历y 数组,并为每个项目从i 创建一个与x 数组长度相同的y 切片,如果一个这样的切片等于x.