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

mml*_*mlb 3 arrays json jq

请注意,这篇文章被标记为jq,我根本不想用 javascript 来做到这一点。

我有一个对象,它的字段之一是数组。我想从对象的数组中删除与条件匹配的元素,但保留该对象。我环顾四周,只能发现仅返回现在项目较少的数组的片段。

这是一个例子:

{
  "foo": "bar",
  "events": [
    {
      "id": 1,
      "msg": "starting"
    },
    {
      "id": 2,
      "msg": "working on it"
    },
    {
      "id": null,
      "msg": "done"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

我想返回以下信息:

{
  "foo": "bar",
  "events": [
    {
      "id": 1,
      "msg": "starting"
    },
    {
      "id": 2,
      "msg": "working on it"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

注意:以防万一这会影响答案,我真的只对最后一个元素感兴趣。我计划在以下管道阶段构建一个新对象,例如:

jq '$answer | {bar:.foo, event: .events[-1].msg}`
Run Code Online (Sandbox Code Playgroud)

我都尝试过

select(.events[].id != null)
Run Code Online (Sandbox Code Playgroud)

和

del(.events[], select(.id == null)))
Run Code Online (Sandbox Code Playgroud)

没有运气。

Ini*_*ian 5

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

jq 'del(.events[] | select(.id == null))'
Run Code Online (Sandbox Code Playgroud)

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

jq 'del( .events[2] )'
Run Code Online (Sandbox Code Playgroud)

但请记住,对于您的原始问题,不建议使用这种方法,因为您不知道键的哪个索引将包含空值。