Как удалить элементы из массива в объекте JSON, содержащем значение - PullRequest
0 голосов
/ 25 мая 2018

Обратите внимание, что этот пост помечен jq, я вообще не пытаюсь сделать это с помощью javascript.

У меня есть объект, массив которого является одним из егополя.Я хотел бы удалить элементы из массива объекта, которые соответствуют критериям, но оставить объект вокруг.Я посмотрел вокруг и смог найти только фрагменты, возвращающие просто массив, в котором сейчас меньше элементов.

Вот пример:

{
  "foo": "bar",
  "events": [
    {
      "id": 1,
      "msg": "starting"
    },
    {
      "id": 2,
      "msg": "working on it"
    },
    {
      "id": null,
      "msg": "done"
    }
  ]
}

и я хотел бы получить следующее:

{
  "foo": "bar",
  "events": [
    {
      "id": 1,
      "msg": "starting"
    },
    {
      "id": 2,
      "msg": "working on it"
    }
  ]
}

Примечание. На всякий случай это повлияет на ответ. Меня действительно интересует только последний элемент.Я планирую построить новый объект на следующем этапе конвейера, например:

jq '$answer | {bar:.foo, event: .events[-1].msg}`

Я попробовал оба

select(.events[].id != null)

и

del(.events[], select(.id == null)))

без удачи.

Ответы [ 2 ]

0 голосов
/ 26 мая 2018

Если вы сомневаетесь (иногда del(...) немного сложно), вы всегда можете использовать map(select(...)), например, в данном случае:

.events |= map(select(.id != null))

или, возможно, даже:

.events |= map(select(.id))
0 голосов
/ 25 мая 2018

Я думаю, вы, вероятно, ищете фильтр jq, как показано ниже.Выражение .events[] | select(.id == null) возвращает ключ к объекту, где значение id равно нулю, а del() удаляет эту пару ключ / значение.

jq 'del(.events[] | select(.id == null))'

В качестве примечания, если вы просто хотите удалитьэлемент просто по индексу, вы можете просто использовать, как показано ниже.В приведенном ниже примере удаляется элемент из индекса 2, массив фактически начинается с 0.

jq 'del( .events[2] )'

Но помните, что этот способ не рекомендуется для исходной задачи, так как вы не знаете, какой индекс вашего ключа будетсодержит нулевое значение.

...