jq-如何基于';白名单';财产价值评估

jq-如何基于';白名单';财产价值评估,jq,whitelist,Jq,Whitelist,因为一个例子胜过千言万语,所以假设我有以下JSON流: {"a": 0, "b": 1} {"a": 2, "b": 2} {"a": 7, "b": null} {"a": 3, "b": 7} 如何保留.b属性是[1,7]之一的所有对象(实际上列表要长得多,所以我不想执行选择(.b==1或.b==7))。我正在寻找这样的东西:select(.b in[1,7]),但我在手册页中找不到我要找的内容。在$collection中执行$value可以使用模式select($value==$coll

因为一个例子胜过千言万语,所以假设我有以下JSON流:

{"a": 0, "b": 1}
{"a": 2, "b": 2}
{"a": 7, "b": null}
{"a": 3, "b": 7}

如何保留
.b
属性是
[1,7]
之一的所有对象(实际上列表要长得多,所以我不想执行
选择(.b==1或.b==7)
)。我正在寻找这样的东西:
select(.b in[1,7])
,但我在手册页中找不到我要找的内容。

在$collection中执行
$value
可以使用模式
select($value==$collection[])
实现。一个更有效的选择是
select(any($value==$collection[];))
,因此您的过滤器应该是:

[1, 7] as $whitelist | select(any(.b == $whitelist[]; .))
将数组放在变量中有其好处,因为它允许您使用参数轻松更改白名单

$ jq --argjson whitelist '[2, 7]' 'select(any(.b == $whitelist[]; .))'

以下使用index/1的方法与最初寻求的方法类似(“[1,7]中的.b”),如果白名单较大,则可能明显快于在
select
中使用。[]的方法

如果jq支持--argjson:

jq --argjson w '[1,7]' '. as $in | select($w | index($in.b))'
否则:

jq --arg w '[1,7]' '. as $in | ($w|fromjson) as $w | select($w | index($in.b))'
或:

更新 2017年1月30日,在中添加了一个名为的内置代码,用于有效测试流中是否包含JSON实体。它还可以用于有效地测试阵列中的成员资格。例如,上面对--argjson的调用可以简化为:

jq --argjson w '[1,7]' 'select( .b | IN($w[]) )'
如果您的jq在/1中没有
,那么只要您的jq有
第一个/1
,您就可以使用此等效定义:

def IN(s): . as $in | first(if (s == $in) then true else empty end) // false;

原始问题指的是流,而不是数组,在这种情况下,您不需要使用
map
。另外,请注意
[1,7][]
可以表示为
(1,7)
。最初,该问题表示输入是一个数组,是的,我不适合编辑这个问题。一旦我看到你的答案,我只是想让这个问题更加集中@圣地亚哥普雷斯塔
(1,7)
构造的文档在哪里,我似乎在手册页中找不到它。@foo:关键是,使用逗号,表达式会产生多个值。在数组上使用
[]
时,该表达式也会产生多个值。我想手册中的相关章节已经打开了<代码>[1,2,3][]
相当于
1,2,3
def IN(s): . as $in | first(if (s == $in) then true else empty end) // false;