使用 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))