выбрать элементы массива и обновить его на месте - PullRequest
0 голосов
/ 07 марта 2020

Учитывая следующее JSON,

Я пытаюсь отфильтровать элементы в массиве машин, где массив комментариев элемента равен нулю:

.cars[] |  select(.comments == null)

или массив комментариев элемента существует, и ни один из объектов комментариев не содержит значения "FooBar"

.cars[] |  select( select(.comments != null) | (any(.comments[]; index("FooBar")) | not) )

при сохранении исходной структуры.

С помощью jq я могу понять, как создать желаемые критерии отфильтровать, но то, что я не могу обернуть вокруг себя, это как применить это к элементам верхнего уровня.

JSON input:

{
    "person": {
        "first_name": "Bob",
        "last_name": "Smith"
    },
    "addresses": [
        {
            "home": {
                "line1": "123",
                "line2": "A st."
            }
        },
        {
            "work": {
                "line1": "456",
                "line2": "B st."
            }
        }
    ],
    "cars": [
        {
            "make": "Honda",
            "model": "Civic"
        },
        {
            "make": "Honda",
            "model": "Accord"
        },
        {
            "make": "Honda",
            "model": "Pilot",
            "comments": [
                "Comment 1",
                "Comment 2",
                "FooBar"
            ]
        },
        {
            "make": "Honda",
            "model": "Passport",
            "comments": [
                "Comment 3",
                "Comment 4"
            ]
        }
    ]
}

JSON Outut То же, что и входные данные, но отфильтрован объект с массивом комментариев, содержащий значение «FooBar»:

{
    "person": {
        "first_name": "Bob",
        "last_name": "Smith"
    },
    "addresses": [
        {
            "home": {
                "line1": "123",
                "line2": "A st."
            }
        },
        {
            "work": {
                "line1": "456",
                "line2": "B st."
            }
        }
    ],
    "cars": [
        {
            "make": "Honda",
            "model": "Civic"
        },
        {
            "make": "Honda",
            "model": "Accord"
        },
        {
            "make": "Honda",
            "model": "Passport",
            "comments": [
                "Comment 3",
                "Comment 4"
            ]
        }
    ]
}

1 Ответ

2 голосов
/ 07 марта 2020

Просто используйте оператор update-assignment (|=).

.cars |= map(select(.comments))
.cars |= map(select(.comments and any(.comments[]; index("FooBar")) | not))
...