使用 jq 根据输入中其他地方的值从数组中删除项目
Using jq to remove items from an array based on values elsewhere in the input
我是 jq
的新手,我正努力全神贯注地做一些我认为很简单的事情。任何关于如何改进这一点的想法将不胜感激。
鉴于此输入:
{
"source": {
"items": [
{ "id": "aaa", "name": "this" },
{ "id": "bbb", "name": "that" },
{ "id": "ccc", "name": "the other" }
]
},
"update": {
"toRemove": [
"aaa",
"ccc"
]
}
}
我想要这个结果:
{
"items": [
{ "id": "bbb", "name": "that" }
]
}
这个过滤器可以完成工作,但变量让我相信有更清洁的方法。
. as $root | .source + { items: [.source.items[] | select(.id as $id | $root.update.toRemove | contains([$id]) | not)]}
游乐场link如果有兴趣:https://jqplay.org/s/GpVJfbTO-Q
使用 inside
而不是 contains
的更短版本:
.update.toRemove as $temp |
{items: [.source.items[] | select([.id] | inside($temp) | not)]}
这里有一个简洁高效的解决方案:
.update.toRemove as $rm
| .source
| .items |= map( select(.id | IN($rm[]) | not))
我是 jq
的新手,我正努力全神贯注地做一些我认为很简单的事情。任何关于如何改进这一点的想法将不胜感激。
鉴于此输入:
{
"source": {
"items": [
{ "id": "aaa", "name": "this" },
{ "id": "bbb", "name": "that" },
{ "id": "ccc", "name": "the other" }
]
},
"update": {
"toRemove": [
"aaa",
"ccc"
]
}
}
我想要这个结果:
{
"items": [
{ "id": "bbb", "name": "that" }
]
}
这个过滤器可以完成工作,但变量让我相信有更清洁的方法。
. as $root | .source + { items: [.source.items[] | select(.id as $id | $root.update.toRemove | contains([$id]) | not)]}
游乐场link如果有兴趣:https://jqplay.org/s/GpVJfbTO-Q
使用 inside
而不是 contains
的更短版本:
.update.toRemove as $temp |
{items: [.source.items[] | select([.id] | inside($temp) | not)]}
这里有一个简洁高效的解决方案:
.update.toRemove as $rm
| .source
| .items |= map( select(.id | IN($rm[]) | not))