gpt4 book ai didi

jq - 返回所有具有与条件匹配的子属性的顶级属性键

转载 作者:行者123 更新时间:2023-12-04 16:44:13 25 4
gpt4 key购买 nike

我的 JSON 看起来像:

{
"foo": {
"restricted": true
},
"bar": {
"restricted": false
},
"baz": { }
}

作为单行:

{"foo":{"restricted":true},"bar":{"restricted":false},"baz":{}}

我想获取所有返回的顶级属性键,这些键要么是 restricted == false,要么没有 restricted 子属性。对于上面的示例 JSON,预期的输出是:

"bar"
"baz"

最佳答案

我想到了以下表达式:

jq "to_entries[] | select(.value.restricted|not) | .key"

to_entries 将顶层对象转换为一个对象数组,每个对象都有一个“key”和一个“value”属性:

[
{
"key": "foo135",
"value": {
"restricted": true
}
},
{
"key": "foo246",
"value": {
"restricted": false
}
},
{
"key": "foo345",
"value": {}
}
]

[] 展开这个数组。这样做是为了在下一步中过滤单个对象:

{
"key": "foo135",
"value": {
"restricted": true
}
}
{
"key": "foo246",
"value": {
"restricted": false
}
}
{
"key": "foo345",
"value": {}
}

然后为每个对象应用过滤器:select(.value.restricted|not)。要过滤掉子属性 restricted 为真值的属性,可以使用 |not 反转 .value.restricted 以选择具有 restricted 的对象== false 以及没有此属性的对象使用单个条件:

{
"key": "foo246",
"value": {
"restricted": false
}
}
{
"key": "foo345",
"value": {}
}

最后选择“key”属性:.key。这将返回匹配对象的名称(最初是顶级属性键):

"foo246"
"foo345"

注意 select(...) | 中的管道字符 | .key 不是严格需要的。没有的结果是一样的。

如果需要一个字符串数组作为结果...

[
"foo246",
"foo345"
]

...那么可以使用下面的表达式:

jq "to_entries | map(select(.value.restricted|not).key)"

如您所见,select() 可以在 map() 内部使用来过滤掉单个元素,它甚至可以与属性过滤器 .key.

如果像 map(...)[] 一样在末尾附加 [],那么数组会被分解,结果又是一个字符串列表,与初始示例类似,但使用的方法略有不同。

关于jq - 返回所有具有与条件匹配的子属性的顶级属性键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51968246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com