Bre*_*ett 3 arrays json indexof jq
我正在尝试为JSON创建一个jq过滤器,类似于如何根据内部数组中的值使用jq过滤对象数组? - 但即使使用它作为基础似乎并没有给我我想要的结果.
这是我的例子json
[{"id":"0001","tags":["one","two"]},{"id":"0002", "tags":["two"]}]
Run Code Online (Sandbox Code Playgroud)
我想返回一个ID列表,其中标签包含"one"(不是部分字符串匹配,完整元素匹配).
我尝试了一些变化,但无法正确使用过滤器.
. - map(select(.resources[] | contains("one"))) | .[] .id
Run Code Online (Sandbox Code Playgroud)
返回 "0001","0002"
尝试... .resources[].one)) | ...按"一个"过滤并期望只获得时,也尝试了但总是得到完整列表0001
我在哪里过滤错了?(有大约30分钟的jq经验,所以请原谅我的无知,如果这是显而易见的:)
map(select(.tags | index("one")) | .id)
Run Code Online (Sandbox Code Playgroud)
由于您的问题描述表明您要检查数组是否包含"one",因此最简单的方法是使用索引.
2017年1月30日,IN添加了一个内置命名,用于有效地测试流中是否包含JSON实体.它还可用于有效地测试阵列中的成员资格.在本案中,相关用法是:
map(select(.tags as $tags | "one" | IN($tags[])) | .id)
Run Code Online (Sandbox Code Playgroud)
如果你的jq没有IN/1,那么只要你的jq有first/1,你就可以使用这个等价的定义:
def IN(s): . as $in | first(if (s == $in) then true else empty end) // false;
Run Code Online (Sandbox Code Playgroud)
(在实践中,index/1通常足够快,但其目前的实施(jq 1.5和至少2017年7月的版本)不是最理想的.)