如何从包含值的JSON对象中的数组中删除元素

时间:2018-05-25 16:10:33

标签: arrays json jq

请注意,此帖子已标记为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 :(得分:2)

我认为您可能正在寻找jq过滤器,如下所示。表达式.events[] | select(.id == null)返回id值为空且del()删除该键/值对的对象的键。

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

作为旁注,如果您只想按索引删除元素,可以使用如下方法。下面的示例从索引2中删除元素,该数组实际上从0开始。

jq 'del( .events[2] )'

但是请记住,建议不要使用这种方法来处理原始问题,因为您不知道密钥的哪个索引包含空值。

答案 1 :(得分:0)

如果有疑问(有时del(...)有点棘手),您可以随时使用map(select(...)),例如在本案中:

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

或者甚至是:

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