Использование jq для удаления элементов из массива на основе значений в другом месте ввода

Я новичок в 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)]}

Ссылка на игровую площадку, если интересно: https://jqplay.org/s/GpVJfbTO-Q


person user774031    schedule 12.03.2019    source источник


Ответы (2)


Вот краткое и эффективное решение:

.update.toRemove as $rm
| .source
| .items |= map( select(.id | IN($rm[]) | not))
person peak    schedule 13.03.2019

Немного более короткая версия с использованием inside вместо contains:

.update.toRemove as $temp |
 {items: [.source.items[] | select([.id] | inside($temp) | not)]}
person Kamal    schedule 13.03.2019