使用 jq 获取基于 json 中另一个 属性 的键列表

Getting a list of keys based on another property in json with jq

我正在尝试为 JSON 创建一个 jq 过滤器,类似于 How to filter an array of objects based on values in an inner array with jq? - 但即使使用它作为基础似乎也没有给我想要的结果。

这是我的例子json

[{"id":"0001","tags":["one","two"]},{"id":"0002", "tags":["two"]}]

我想要 return 标签包含 "one" 的 ID 列表(不是部分字符串匹配,完整元素匹配)。

我尝试了一些变体,但无法正确设置过滤器。

. - map(select(.resources[] | contains("one"))) | .[] .id

Returns "0001","0002"

也尝试过 ... .resources[].one)) | ...,但在尝试按 "one" 过滤并期望只得到 0001

时总是得到完整列表

我哪里过滤错了? (有大约 30 分钟的 jq 经验,所以如果很明显,请原谅我的无知:)

map(select(.tags | index("one")) | .id)

因为你的问题描述表明你想检查数组是否包含"one",所以使用index.

是最简单的

更新

2017 年 1 月 30 日,添加了名为 IN 的内置函数,用于高效测试流中是否包含 JSON 实体。它还可以用于有效地测试数组中的成员资格。在本例中,相关用法为:

map(select(.tags as $tags | "one" | IN($tags[])) | .id)

如果你的jq没有IN/1,那么只要你的jq有first/1,你就可以使用这个等价的定义:

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

(在实践中,index/1 通常足够快,但它目前的实现(jq 1.5 和至少到 2017 年 7 月的版本)不是最理想的。)