检查数组是否包含在 rego 中的另一个数组中
Check if array contained within another in rego
我有两个数组:x
和 y
我想检查 x
是否包含在 y
.
中
rego 中没有 contains() 函数。
接下来我尝试创建与 contains() 函数等价的数学函数:
x ⊆ y ⇔ (x ⋂ y) == x
.
所以我尝试执行以下操作:
z := x & y
x == z
但这会产生以下错误:
rego_type_error: and: invalid argument(s)
have: (array[any], any, ???)
want: (set[any], set[any], set[any])
那我该怎么做呢?
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
创建一个 y
的切片,并且长度与 x
数组相同,如果一个这样的切片等于 x
.
,则 return 为真
我有两个数组:x
和 y
我想检查 x
是否包含在 y
.
rego 中没有 contains() 函数。
接下来我尝试创建与 contains() 函数等价的数学函数:
x ⊆ y ⇔ (x ⋂ y) == x
.
所以我尝试执行以下操作:
z := x & y
x == z
但这会产生以下错误:
rego_type_error: and: invalid argument(s) have: (array[any], any, ???) want: (set[any], set[any], set[any])
那我该怎么做呢?
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
创建一个 y
的切片,并且长度与 x
数组相同,如果一个这样的切片等于 x
.